Cod sursa(job #300698)

Utilizator c_iulyanCretu Iulian c_iulyan Data 7 aprilie 2009 17:03:18
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;

long x[N],y[N],a[N],t[1000000],n;

void rd()
{
scanf("%ld",&n);
for(long i=1;i<=n;i++)
	{
	scanf("%ld",&x[i]);
	y[i]=x[i];
	}
}

void ud(long x,long i,long j,long nd,long v)
{
if(i==j&&j==x)
	{
	t[nd]=v;
	return;
	}
	
long m=(i+j)/2;

if(m<x)
	ud(x,m+1,j,nd*2,v);
else 
	ud(x,i,m,nd*2+1,v);
	
t[nd]=max(t[nd*2],t[nd*2+1]);
}

long qr(long x,long y,long i,long j,long nd)
{
if(x<=i&&j<=y)
	return t[nd];

long m=(i+j)/2,s1=0,s2=0;

if(m<y)
	s1=qr(x,y,m+1,j,nd*2);
if(x<=m)
	s2=qr(x,y,i,m,nd*2+1);

return max(s1,s2);
}

void go()
{
sort(y+1,y+n+1);

long max=0,i;
for(i=n;i;i--)
	{
	long c=upper_bound(y+1,y+n+1,x[i])-y-1;
	a[i]=qr(c+1,n,1,n,1)+1;
	ud(c,1,n,1,a[i]);
	if(max<a[i]) max=a[i];
	}
	
printf("%ld\n",max);
for(i=1;i<=n;i++)
	if(a[i]==max)
		printf("%ld ",x[i]),max--;
}

int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);

rd();
go();

return 0;
}