Pagini recente » Cod sursa (job #1076151) | Cod sursa (job #1963284) | Cod sursa (job #3252595) | Cod sursa (job #2256772) | Cod sursa (job #1530036)
#include<stdio.h>
long n,i,x[100001],poz[100001],vm[100001],dad[100001],st,dr,mi,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;poz[1]=1;vm[1]=x[1];
for(i=2;i<=n;i++)
{ if(x[i]>vm[lmax])
{ lmax++;poz[lmax]=i;vm[lmax]=x[i];dad[i]=poz[lmax-1];continue;}
if(x[i]<=vm[1])
{ poz[1]=i;vm[1]=x[i];dad[i]=0;continue;}
st=1;dr=lmax;
while(dr-st>1)
{ mi=(st+dr)/2;
if(vm[mi]<x[i])st=mi;
else dr=mi;
}
if(x[i]<vm[dr])
{ poz[dr]=i;vm[dr]=x[i];dad[i]=poz[st];}
}
printf("%ld\n",lmax);
afis(poz[lmax]);
fcloseall();
return 0;
}
void afis(long pc)
{
if(!pc)return;
afis(dad[pc]);
printf("%ld ",x[pc]);
}