Pagini recente » Cod sursa (job #3236846) | Cod sursa (job #624636) | Cod sursa (job #590776) | Cod sursa (job #1410047) | Cod sursa (job #894109)
Cod sursa(job #894109)
#include<stdio.h>
#define Nmax 100002
using namespace std;
int n;
int a[Nmax],b[Nmax],l[Nmax],pos[Nmax];
void citire()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
}
int caut(int x,int lm)
{
int p,u,m;
p=0;
u=lm;
while(p<=u)
{
m=p+((u-p)>>1);
if(a[l[m]] < a[x] && a[l[m+1]] >= a[x])
return m;
if(a[l[m+1]] < a[x])
p=m+1;
else
u=m-1;
}
return lm;
}
void scrie(int x)
{
if(pos[x]>0)
scrie(pos[x]);
printf("%d ",a[x]);
}
void rezolv()
{
int i,p,lm,maxim;
b[1]=1;
l[1]=1;
lm=1;
for(i=2;i<=n;++i)
{
p=caut(i,lm);
pos[i]=l[p];
b[i]=p+1;
l[p+1]=i;
if(lm<p+1)
lm=p+1;
}
maxim=0; p=0;
for(i=1;i<=n;++i)
if(maxim < b[i])
{
maxim=b[i];
p=i;
}
printf("%d\n",maxim);
scrie(p);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citire();
rezolv();
fclose(stdin);
fclose(stdout);
return 0;
}