Cod sursa(job #538651)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 21 februarie 2011 19:52:15
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

#define maxn 100005

int i,N,a,b,MAX,imax,pmax,vmax;
int v[maxn],id[maxn],ids[maxn],Smax[maxn],A[4*maxn],P[4*maxn];
int from[maxn],Sir[maxn];

void citire()
{
	fin >> N;
	for(i=1;i<=N;i++)
		fin >> v[i];
}

inline int max(int a, int b)
{
	return a>b ? a : b;
}

void sort(int st, int m, int dr)
{
	int i,j,k,aux[dr-st+2];
	i=1;j=st;
	while(j<=m)
		aux[i++]=id[j++];
	i=1; k=st;
	while(k<j && j<=dr)
		if(v[aux[i]]<=v[id[j]])
			id[k++]=aux[i++];
		else
			id[k++]=id[j++];
	while(k<j)
		id[k++]=aux[i++];
}

void msort(int st, int dr)
{
	if(st<dr)
	{
		int m=st+(dr-st)/2;
		msort(st,m);
		msort(m+1,dr);
		sort(st,m,dr);
	}
}

void update(int k, int st, int dr)
{
	if(st==dr)
	{
		A[k]=b;
		return;
	}
	
	int m=(st+dr)>>1;
	if(a<=m) update(k<<1,st,m);
	else update((k<<1)+1,m+1,dr);
	
	if(Smax[A[k<<1]]>Smax[A[(k<<1)+1]]) A[k]=A[k<<1];
				   else A[k]=A[(k<<1)+1];
}

void query(int k, int st, int dr)
{
	if(a<=st && dr<=b)
	{
		if(Smax[A[k]]>Smax[pmax])
			pmax=A[k];
		return;
	}
	
	int m=(st+dr)>>1;
	if(a<=m) query(k<<1,st,m);
	if(m<b) query((k<<1)+1,m+1,dr);
}

void pd()
{
	
	for(i=1;i<=N;i++)
	{
		pmax=0;
		a=1; b=ids[i]-1;
		for(;b>0 && v[i]==v[id[b]];b--);
		if(b) query(1,1,N);
		Smax[i]=Smax[pmax]+1;
		from[i]=pmax;
		if(Smax[i]>MAX)
		{
			MAX=Smax[i];
			imax=i;
		}
		a=ids[i]; b=i;
		update(1,1,N);
	}
}

void afisare()
{
	int k,NR=MAX;
	for(k=imax;k>0;k=from[k])
		Sir[NR--]=v[k];
	fout << MAX << '\n';
	for(i=1;i<=MAX;i++)
		fout << Sir[i] << ' ';
}

int main()
{
	citire();
	for(i=1;i<=N;i++) id[i]=i; // id[i]=poz in v al celui de-al i-lea el in vs.
	msort(1,N);
	for(i=1;i<=N;i++) ids[id[i]]=i; // ids[i]=poz in id al el. v[i]
	pd();
	afisare();
}