Cod sursa(job #658026)

Utilizator lazarik1992Lazar Catalin-Alexandru lazarik1992 Data 7 ianuarie 2012 20:02:12
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#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]);
}