Pagini recente » Cod sursa (job #2354054) | Cod sursa (job #3156445) | Cod sursa (job #1029067) | Cod sursa (job #2332636) | Cod sursa (job #221281)
Cod sursa(job #221281)
#include<stdio.h>
#define inf 2000000000
FILE*fin=fopen("scmax.in","r");
FILE*fout=fopen("scmax.out","w");
int n,s[100001],t[2][100001],sol[2][100001],tt[100001];
int main()
{
int i,st,dr,mij,max,f;
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++)
fscanf(fin,"%d",&s[i]);
for(i=1;i<=n;i++)
t[0][i]=inf;
t[0][0]=0;t[1][0]=0;
for(i=1;i<=n;i++)
{
st=0;dr=n;
while(st<dr-1)
{
mij=(st+dr)/2;
if(t[0][mij]<s[i]) st=mij;
else dr=mij-1;
}
if(t[0][dr]<s[i])
{
sol[0][i]=dr+1;
sol[1][i]=t[1][dr];
}
else
{
sol[0][i]=st+1;
sol[1][i]=t[1][st];
}
if(t[0][sol[0][i]]>s[i])
{
t[0][sol[0][i]]=s[i];
t[1][sol[0][i]]=i;
}
}
max=0;
for(i=1;i<=n;i++)
if(sol[0][i]>max)
{
max=sol[0][i];
f=i;
}
for(i=1;i<=max;i++)
{
tt[i]=f;
f=sol[1][f];
}
fprintf(fout,"%d\n",max);
for(i=max;i>=1;i--)
fprintf(fout,"%d ",s[tt[i]]);
fclose(fin);
fclose(fout);
return 0;
}