This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://judge.yosupo.jp/problem/longest_increasing_subsequence"
#include "../../../src/template/template.hpp"
#include "../../../src/dp/longest_increasing_sequence.hpp"
int main(void) {
int n;
cin >> n;
vector<int> a(n);
rep(i, 0, n) cin >> a[i];
vector<int> lis = longest_increasing_sequence(a);
cout << lis.size() << '\n';
rep(i, 0, (int)lis.size()) cout << lis[i] << " \n"[i + 1 == (int)lis.size()];
}
#line 1 "verify/library_checker/other/longest_increasing_sequence.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/longest_increasing_subsequence"
#line 2 "src/template/template.hpp"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<long long, long long>;
#define rep(i, a, b) for(long long i = (a); i < (b); ++i)
#define rrep(i, a, b) for(long long i = (a); i >= (b); --i)
constexpr long long inf = 4e18;
struct SetupIO {
SetupIO() {
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(30);
}
} setup_io;
#line 3 "src/dp/longest_increasing_sequence.hpp"
template <typename T>
vector<int> longest_increasing_sequence(const vector<T>& a) {
const int n = a.size();
vector<pair<T, int>> dp;
vector<int> p(n, -1);
for(int i = 0; i < n; ++i) {
auto it = lower_bound(begin(dp), end(dp), make_pair(a[i], -i));
if(it != begin(dp)) p[i] = -prev(it)->second;
if(it == end(dp)) {
dp.emplace_back(a[i], -i);
} else {
*it = make_pair(a[i], -i);
}
}
vector<int> res;
for(int i = -dp.back().second; i != -1; i = p[i]) res.push_back(i);
reverse(begin(res), end(res));
return res;
}
#line 4 "verify/library_checker/other/longest_increasing_sequence.test.cpp"
int main(void) {
int n;
cin >> n;
vector<int> a(n);
rep(i, 0, n) cin >> a[i];
vector<int> lis = longest_increasing_sequence(a);
cout << lis.size() << '\n';
rep(i, 0, (int)lis.size()) cout << lis[i] << " \n"[i + 1 == (int)lis.size()];
}