Pagini recente » Cod sursa (job #2496821) | Cod sursa (job #1525315) | Cod sursa (job #625265) | Cod sursa (job #3289124) | Cod sursa (job #1786026)
#include <iostream>
#include <cstdio>
#define NMAX 100001
using namespace std;
int a[NMAX],p[NMAX],b[NMAX],l[NMAX],n,nr;
int caut(int k)
{
int p,u,m;
p=0;
u=nr;
m=(u+p)/2;
while(p<=u)
if(a[l[m]]<k && a[l[m+1]]>=k)
return m;
else if(a[l[m+1]]<k)
{
p=m+1;
m=(p+u)/2;
}
else
{
u=m-1;
m=(p+u)/2;
}
return nr;
}
void afisre(int k)
{
if(p[k]!=0)
afisre(p[k]);
printf("%d ",a[k]);
}
int main()
{
freopen("scmax.in","r",stdin);
//freopen(".out","w",stdout);
scanf("%d",&n);
nr=1;
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
b[1]=l[1]=1;
l[0]=0;
int maxi=1;
for(int i=2; i<=n; i++)
{
int poz = caut(a[i]);
//cout<<poz<<" "<<nr<<endl;
p[i]=l[poz];
b[i]=poz+1;
l[poz+1]=i;
if(nr<poz+1)
nr=poz+1;
if(b[i]>b[maxi])
maxi=i;
}
printf("%d\n",b[maxi]);
afisre(maxi);
return 0;
}