Pagini recente » Sandbox (cutiuţa cu năsip) | Cod sursa (job #1569436)
#include <stdio.h>
#include <stdlib.h>
int v[100000];
int q[100000];
int p[100000];
int main()
{
FILE *fin, *fout;
int n,i,st,dr,mij,l,max;
fin=fopen("scmax.in","r");
fout=fopen("scmax.out","w");
fscanf(fin,"%d",&n);
for(i=0;i<n;i++){
fscanf(fin,"%d",&v[i]);
}
p[0]=1;
q[0]=0;
l=max=1;
for(i=1;i<n;i++){
if(v[i]>v[q[l-1]]){
q[l]=i;
p[i]=p[q[l-1]]+1;
l++;
if(l>max){
max=l;
}
}
else{
st=0;
dr=l-1;
while(st<dr){
mij=(st+dr)/2;
if(v[q[mij]]<v[i])
st=mij+1;
else
dr=mij;
}
q[st]=i;
if(st==0)
p[i]=1;
else
p[i]=p[q[st-1]]+1;
l=st+1;
}
}
fprintf(fout,"%d\n",max);
n--;
l=max;
i=0;
for(i=0;i<max;){
if(p[n]==l){
q[i]=n;
i++;
l--;
}
n--;
}
i--;
for(i;i>=0;i--){
fprintf(fout,"%d ",v[q[i]]);
}
fclose(fin);
fclose(fout);
return 0;
}