Pagini recente » Cod sursa (job #1132674) | Cod sursa (job #454374) | Cod sursa (job #1805446) | Cod sursa (job #1700511) | Cod sursa (job #1906549)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5 + 10;
const int inf = 2e9 + 10;
int n;
int a[nmax], bst[nmax], prv[nmax];
void input() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
}
int get_pos(int p, int x) {
int res = 0;
int left = 0; int right = p - 1;
while (left <= right) {
int mid = (left + right) >> 1;
if (a[bst[mid]] < x)
res = mid, left = mid + 1;
else right = mid - 1;
}
return res;
}
void solve() {
a[0] = inf;
for (int i = 1; i <= n; ++i) {
int pos = get_pos(i, a[i]);
if (pos == inf) continue;
bst[pos+1] = i;
prv[i] = bst[pos];
}
}
void output() {
int ans;
for (ans = 1; bst[ans+1]; ++ans);
printf("%d\n", ans);
vector < int > v;
for (int i = bst[ans]; i; i = prv[i])
v.push_back(a[i]);
reverse(v.begin(), v.end());
for (auto &it: v) printf("%d ", it);
}
int main() {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
input();
solve();
output();
return 0;
}