Pagini recente » Cod sursa (job #2141202) | Cod sursa (job #2652620) | Cod sursa (job #1678065) | Cod sursa (job #734795) | Cod sursa (job #779152)
Cod sursa(job #779152)
#include <stdio.h>
#include <algorithm>
#define zeros(x) (x&(x-1)^x)
#define NMax 100010
using namespace std;
const char IN[]="scmax.in",OUT[]="scmax.out";
int N,L,father,Rez,PRez;
int v[NMax],v2[NMax],T[NMax],P[NMax],arb[NMax],parb[NMax];
void update(int x,int val,int poz){
for (;x<=L;x+=zeros(x))
if (val>arb[x])
arb[x]=val,parb[x]=poz;
}
int query(int x){
int ret=0;father=0;
for (;x>0;x-=zeros(x))
if (arb[x]>ret)
ret=arb[x],father=parb[x];
return ret;
}
int search(int x){
int i,step;
for (step=1;step<=L;step<<=1);
for (i=0;step;step>>=1)
if (i+step<=L && v2[i+step]<=x)
i+=step;
return i;
}
void write(int x){
if (!x) return;
write(P[x]);
printf("%d ",v[x]);
}
int main()
{
int i,x;
freopen(IN,"r",stdin);
scanf("%d",&N);
for (i=1;i<=N;++i) scanf("%d",v+i),v2[i]=v[i];
fclose(stdin);
sort(v2+1,v2+N+1);
L=unique(v2+1,v2+N+1)-v2-1;
for (i=1;i<=N;++i)
{
T[i]=query((x=(search(v[i])))-1)+1;P[i]=father;
update(x,T[i],i);
if (T[i]>Rez) Rez=T[i],PRez=i;
}
freopen(OUT,"w",stdout);
printf("%d\n",Rez);
write(PRez);
fclose(stdout);
return 0;
}