Pagini recente » Cod sursa (job #2807177) | Cod sursa (job #531691) | Cod sursa (job #2447023) | Cod sursa (job #2553236) | Cod sursa (job #752405)
Cod sursa(job #752405)
#include<stdio.h>
long n, i, x[100001], position[100001], vm[100001], dad[100001], st, dr, mij, lmax;
void afis(long pc);
int main()
{
freopen("scmax.in", "rt", stdin);
freopen("scmax.out", "wt", stdout);
scanf("%ld",&n);
for(i = 1; i <= n; i++)
scanf("%ld",&x[i]);
lmax = 1;
position[1] = 1;
vm[1] = x[1];
for(i = 2; i <= n; i++){
if(x[i] > vm[lmax]){
lmax++;
position[lmax] = i;
vm[lmax] = x[i];
dad[i] = position[lmax-1];
continue;
}
if(x[i] <= vm[1]){
position[1] = i;
vm[1] = x[i];
dad[i] = 0;
continue;
}
st = 1;
dr = lmax;
while(dr-st > 1){
mij = (st + dr) / 2;
if(vm[mij] < x[i])
st = mij;
else
dr = mij;
}
if(x[i] < vm[dr]){
position[dr] = i;
vm[dr] = x[i];
dad[i] = position[st];
}
}
printf("%ld\n", lmax);
afis(position[lmax]);
fcloseall();
return 0;
}
void afis(long pc)
{
if(!pc)
return;
afis(dad[pc]);
printf("%ld ",x[pc]);
}