Pagini recente » Cod sursa (job #2974726) | Cod sursa (job #801107) | Cod sursa (job #27952) | Cod sursa (job #2633305) | Cod sursa (job #851972)
Cod sursa(job #851972)
#include <stdio.h>
#include <algorithm>
#define NMax 100010
#define zeros(x) ( (x&(x-1))^x )
using namespace std;
const char IN[]="scmax.in",OUT[]="scmax.out";
int N,L,Rez,father;
int v[NMax], a[NMax], T[NMax], P[NMax], arb[NMax], parb[NMax];
void update(int x,int v,int f)
{
for (;x<=L;x+=zeros(x))
if (v>arb[x])
arb[x]=v,
parb[x]=f;
}
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 && a[i+step]<=x)
i+=step;
return i;
}
void write(int x)
{
if (!x) return;
write(P[x]);
printf("%d ",a[v[x]]);
}
int main()
{
int i;
freopen(IN,"r",stdin);
scanf("%d",&N);
for (i=1;i<=N;++i) scanf("%d",v+i),a[i]=v[i];
fclose(stdin);
sort(a+1,a+N+1);
L=unique(a+1,a+N+1)-a-1;
for (i=1;i<=N;++i) v[i]=search(v[i]);
for (i=1;i<=N;++i)
{
T[i]=1+query(v[i]-1);
P[i]=father;
update(v[i],T[i],i);
if (T[i]>T[Rez]) Rez=i;
}
freopen(OUT,"w",stdout);
printf("%d\n",T[Rez]);
write(Rez);printf("\n");
fclose(stdout);
return 0;
}