Pagini recente » Cod sursa (job #3278234) | Cod sursa (job #675308) | Cod sursa (job #2678292) | Cod sursa (job #3169326) | Cod sursa (job #1743241)
#include <cstdio>
#include <cstdint>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
uint64_t N;
scanf("%d", &N);
vector<uint64_t> a(N), p(N), l(N+1);
for(uint64_t i = 0; i < N; i++) {
scanf("%d", &a[i]);
}
uint64_t L = 1;
l[1] = 0;
for(uint64_t i = 1; i < N; i++) {
auto pos = equal_range(l.begin()+1, l.begin()+L+1, i,
[=](auto x, auto y){return a[x] < a[y];}
);
if(pos.first != pos.second)
continue; // element already exists
uint64_t k = pos.first - l.begin();
l[k] = i;
p[i] = l[k-1];
if(k > L)
L = k;
}
printf("%d\n", L);
vector<uint64_t> res(L);
for(uint64_t i = 0, j = l[L]; i < L; i++, j = p[j])
res[L-1-i] = a[j];
for(uint64_t i = 0; i < L-1; i++)
printf("%d ", res[i]);
printf("%d\n", res[L-1]);
return 0;
}