Pagini recente » Cod sursa (job #339697) | Cod sursa (job #1890794) | Cod sursa (job #950026) | Cod sursa (job #3229381) | Cod sursa (job #813007)
Cod sursa(job #813007)
#include <stdio.h>
#define N_MAX 100010
int v[N_MAX], best[N_MAX], pre[N_MAX], time[N_MAX];
int k, n;
void modifyElement(int i, int x) {
if(time[i] < k) {
pre[i] = best[i];
time[i] = k;
}
best[i] = x;
}
void add(int x) {
int step = 0, poz = 0;
for( ; (1<<step) < k; step++);
for(int i = step; i >= 0; i--) {
if( poz + (1<<i) <= k && best[poz + (1<<i)] < x) {
poz += (1<<i);
}
}
poz++;
if(poz > k) {
best[++k] = x;
pre[k] = x;
time[k] = k;
}
else {
modifyElement(poz,x);
}
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
add(v[i]);
}
printf("%d\n", k);
for(int i = 1; i <= k; i++) {
if(time[i] < k) pre[i] = best[i];
printf("%d ", pre[i]);
}
printf("\n");
return 0;
}