Pagini recente » Cod sursa (job #2588873) | Cod sursa (job #361829) | Cod sursa (job #638373) | Cod sursa (job #1548004) | Cod sursa (job #315485)
Cod sursa(job #315485)
#include<stdio.h>
int n,nr;
int v[100002];
int p[100002],q[100002];
int sol[100002];
void read()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
}
int cautare(int x)
{
int st,dr,m;
st=1;
dr=nr;
while(st!=dr)
{
m=(st+dr)>>1;
if(q[m]>=x)
dr=m;
else
st=m+1;
}
while(q[st]<x)
st++;
return st;
}
void rez()
{
int i,poz,lim,j;
nr=1;
q[1]=q[2]=2000000002;
for(i=1;i<=n;i++)
{
poz=cautare(v[i]);
if(poz==nr+1)
{
q[++nr]=v[i];
p[i]=nr;
q[nr+1]=2000000002;
}
else
{
q[poz]=v[i];
p[i]=poz;
}
}
lim=n;
for(i=nr;i>=1;i--)
for(j=lim;j>=1;j--)
if(p[j]==i)
{
sol[i]=v[j];
lim=j-1;
break;
}
printf("%d\n",nr);
for(i=1;i<=nr;i++)
printf("%d ",sol[i]);
}
int main()
{
read();
rez();
return 0;
}