Pagini recente » Cod sursa (job #2888825) | Cod sursa (job #1634327) | Cod sursa (job #1915049) | Cod sursa (job #1003264) | Cod sursa (job #1731128)
#include <stdio.h>
#define lim 100005
int v[lim],poz[lim],next[lim];
int caut(int st,int dr,int val){
int mij,rasp=dr+1;
while(st<=dr){
mij=(st+dr)/2;
if(v[poz[mij]]>val){
//rasp=mij;
st=mij+1;
}
else{
rasp=mij;
dr=mij-1;
}
}
return rasp;
}
int main(){
FILE *fin,*fout;
fin=fopen("scmax.in","r");
fout=fopen("scmax.out","w");
int i,j,n,m=0;
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++)
fscanf(fin,"%d",&v[i]);
v[0]=2000000000;
for(i=n;i>=1;i--){
j=caut(0,m,v[i]);
if(j>m){
next[i]=poz[j-1];
m=j;
poz[j]=i;
}
else{
if(v[poz[j]]<v[i]){
next[poz[j-1]]=i;
poz[j]=i;
}
}
}
fprintf(fout,"%d\n",m);
for(i=poz[m];i>0;i=next[i])
fprintf(fout,"%d ",v[i]);
fclose(fin);
fclose(fout);
return 0;
}