Pagini recente » Cod sursa (job #2224575) | Cod sursa (job #2461253) | Cod sursa (job #2835326) | Cod sursa (job #2624014) | Cod sursa (job #3312544)
#include <bits/stdc++.h>
using namespace std;
vector<int> a;
vector<pair<int, int>> b;
vector<int> c;
void print_seq(int i) {
if (b[i].second != -1) {
print_seq(b[i].second);
}
cout << a[i] << " ";
}
int search_pos(int x, pair<int, int>& o) {
int p = 0;
int q = o.first;
while (p < q) {
int m = (p + q) / 2;
if (a[c[m]] < x) {
p = m + 1;
} else {
q = m;
}
}
return p;
}
int main() {
#ifndef LOCAL
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
a.resize(n);
b.resize(n, make_pair(0, -1));
c.resize(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
pair<int, int> o(0, 0);
for (int i = 0; i < n; i++) {
int p = search_pos(a[i], o);
b[i] = {p + 1, p > 0 ? c[p - 1] : -1};
c[p] = i;
if (make_pair(p + 1, 0) > o) {
o = {p + 1, i};
}
}
cout << o.first << "\n";
print_seq(o.second);
cout << "\n";
return 0;
}