Pagini recente » Cod sursa (job #1607234) | Cod sursa (job #1509293) | Cod sursa (job #92139) | Cod sursa (job #2118158) | Cod sursa (job #1743207)
#include <cstdio>
#include <cstdint>
#include <vector>
using namespace std;
uint64_t N;
vector<uint64_t> a;
vector<uint64_t> p;
vector<uint64_t> l;
// l[i] == index of smallest element ending a seq of len i
uint64_t L;
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &N);
a.resize(N);
for(uint64_t i = 0; i < N; i++) {
scanf("%d", &a[i]);
}
p.resize(N+1);
l.resize(N+1);
l[1] = 0;
L = 1;
for(uint64_t i = 1; i < N; i++) {
uint64_t lo = 1, hi = L;
uint64_t ignore = 0;
while(lo <= hi) {
uint64_t m = (lo+hi)/2;
if(a[i] < a[l[m]])
hi = m-1;
else if(a[i] > a[l[m]])
lo = m+1;
else { ignore = 1; break; }
}
if(ignore)
continue;
l[lo] = i;
p[i] = l[lo-1];
if(lo > L)
L = lo;
}
printf("%d\n", L);
// for(uint64_t i = 0; i <= L; i++) {
// printf("l[%d] = %d\n", i, l[i]);
// }
// printf("\n");
// for(uint64_t i = 0; i < N; i++) {
// printf("p[%d] = %d\n", i, p[i]);
// }
vector<uint64_t> res(L);
for(int64_t i = L-1, j = l[L]; i >= 0; i--) {
res[i] = a[j];
j = p[j];
}
for(uint64_t i = 0; i < L-1; i++)
printf("%d ", res[i]);
printf("%d\n", res[L-1]);
return 0;
}