Pagini recente » Cod sursa (job #1645843) | Cod sursa (job #75867) | Cod sursa (job #383906) | Cod sursa (job #593971) | Cod sursa (job #484440)
Cod sursa(job #484440)
#include<algorithm>
#include<stdio.h>
#define Nmax 101010
using namespace std;
int AIB[Nmax],AIB2[Nmax],best[Nmax],pre[Nmax],maxim,ifin,p[Nmax];
int N,num;
struct cel
{
int nr,ind,x;
}l[Nmax];
int zeros(int x)
{
return ((x ^ (x - 1)) & x );
}
void Add(int x, int q,int nr)
{
int i;
for (i = x; i <= N; i += zeros(i))
if(AIB[i]<q)
{
AIB[i]=q;
AIB2[i]=nr;
}
}
int comp(int x)
{
int i, ret = 0;
for (i = x; i > 0; i -= zeros(i))
ret =max(AIB[i],ret);
return ret;
}
int prepro(int x)
{
int i,real, ret = 0;
for (i = x; i > 0; i -= zeros(i))
if(ret<AIB[i])
{
ret=AIB[i];
real=AIB2[i];
}
return real;
}
int cmp(cel a,cel b)
{
return a.nr<b.nr;
}
void recur(int x)
{
if(x)
{
recur(pre[x]);
printf("%d ",p[x]);
return;
}
return;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=N;++i)
{
scanf("%d",&l[i].nr);
l[i].ind=i;
l[i].x=l[i].nr;
p[i]=l[i].nr;
}
sort(l+1,l+N+1,cmp);
num=1;
for(int i=1;i<=N;++i)
{
l[l[i].ind].x=num;
if(l[i].nr!=l[i+1].nr)
++num;
}
// for(int i=1;i<=N;++i)
// printf("%d ",l[i].x);
for(int i=1;i<=N;++i)
{
best[i]=1;
best[i]=max(comp(l[i].x-1)+1,best[i]);
pre[i]=prepro(l[i].x);
Add(l[i].x,best[i],i);
if(best[i]>maxim)
{
maxim=best[i];
ifin=i;
}
}
printf("%d\n",maxim);
recur(ifin);
// for(int i=1;i<=N;++i)
// printf("%d ",best[i]);
}