Pagini recente » Cod sursa (job #2503095) | Cod sursa (job #2541163) | Cod sursa (job #1085566) | Cod sursa (job #1803710) | Cod sursa (job #851973)
Cod sursa(job #851973)
#include <stdio.h>
#include <algorithm>
#define NMax 100010
#define LMax 1500010
#define zeros(x) ( (x&(x-1))^x )
using namespace std;
const char IN[]="scmax.in",OUT[]="scmax.out";
int N,L,Rez,father,p=0;
int v[NMax], a[NMax], T[NMax], P[NMax], arb[NMax], parb[NMax];
char s[LMax];
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]]);
}
void readln(){
fgets( s , LMax , stdin);
p=0;
}
int nextInt(){
int ret=0;
for (; s[p] && (s[p]<'0' || s[p]>'9');++p);
for (; s[p]>='0' && s[p]<='9';++p)
ret=ret*10+s[p]-'0';
return ret;
}
int main()
{
int i;
freopen(IN,"r",stdin);
scanf("%d\n",&N);
readln();
for (i=1;i<=N;++i)
a[i]=v[i]=nextInt();
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;
}