Cod sursa(job #1460762)

Utilizator ArkinyStoica Alex Arkiny Data 13 iulie 2015 20:31:42
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<algorithm>
using namespace std;
#define MAX 100001

int lst[MAX],v[MAX],R[MAX],AI[MAX*4 +66],pos[MAX],D[MAX],N,i;

ifstream in("scmax.in");
ofstream out("scmax.out");

int query(int x,int y,int l,int r,int k)
{
	if(!y)
		return 0;
	if(x<=l &&  r<=y)
		return AI[k];
	else
	{
		int mid=(l+r)/2;
		int max=0,el;
		if(x<=mid)
			max=query(x,y,l,mid,k*2);
		if(y>mid)
		{
			el=query(x,y,mid+1,r,k*2 +1);
			if(D[el]>D[max])
				max=el;
		}
        
		return max;

	}
}

void update(int e,int val,int l,int r,int k)
{
	if(l==e && r==e)
		AI[k]=val;
	else
	{
		int mid=(l+r)/2;
		if(e<=mid)
			update(e,val,l,mid,k*2);
		else
			update(e,val,mid+1,r,k*2+1);

		 AI[k]=D[AI[k*2]] > D[AI[k*2+1]] ? AI[k*2] : AI[k*2+1]; 
		      
	}
}

int main()
{
	in>>N;
	for(i=1;i<=N;i++)
		in>>lst[i],R[i]=lst[i];

	sort(lst+1,lst + N +1);

	int l=1;

	for(i=2;i<=N;i++)
		if(lst[l]!=lst[i])
			lst[++l]=lst[i];
	for(i=1;i<=N;i++)
		v[i]=lower_bound(lst + 1,lst + l + 1 ,R[i]) -lst;
	
	for(i=1;i<=N;i++)
	{
		pos[i]=query(1,v[i]-1,1,N,1);
		D[i]=1 + D[pos[i]];
		update(v[i],i,1,N,1);
	}
	int mx=0;
	for(i=1;i<=N;i++)
		if(D[i]>D[mx])
			mx=i;
	int j=0;
	for(i=mx;i;i=pos[i])
	{
		lst[++j]=R[i];
	}
	out<<D[mx]<<'\n';
	for(i=j;i;--i)
		out<<lst[i]<<" ";

	return 0;
}