Pagini recente » Cod sursa (job #1480001) | Cod sursa (job #1908016) | Cod sursa (job #3204058) | Cod sursa (job #1051706) | Cod sursa (job #244604)
Cod sursa(job #244604)
#include<stdio.h>
int v[100001],b[100001],pre[100001],n,l=1;
// l lungimea maxima gasita pana la pasul curent
int search(int x)
{
int p=1,u=l,m;
while(p<u)
{
m=(p+u)/2;
if(v[x]<=v[b[m]])
u=m;
else
p=m+1;
}
if(v[b[p]]<v[x]) return 0;
return p;
}
void scrie(int i){
if(pre[i]) scrie(pre[i]);
printf("%d ",v[i]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int i,poz;
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&v[i]);
b[1]=1;
for(i=2;i<=n;++i)
{
poz=search(i);
if(poz==0){
pre[i]=b[l];
b[++l]=i;
}
else{
b[poz]=i;
pre[i]=b[poz-1];
}
}
printf("%d\n",l);
if(l>1) scrie(pre[b[l]]);
printf("%d\n",v[b[l]]);
return 0;
}