Cod sursa(job #1142251)

Utilizator UVS_Elfus_Deneo_KiraUVS-Elfus-Dutzul-Kira UVS_Elfus_Deneo_Kira Data 13 martie 2014 17:22:23
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
#include<algorithm>
#define N 100100
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
struct el{int por,psr,val; } v[N];
int cre(el a,el b){ return a.val<b.val; }
int ori(el a,el b){ return a.por<b.por; }
int come[N],sol[N],poz,len[N],ma,i,t,n,pma,gr,A[N],P[N];
void find(int po)
{
	for(;po;po-=po&-po)
		if(A[po]>ma)
		{
			ma=A[po];
			poz=P[po];
		}
}
void upd(int po,int val)
{
	for(;po<=t;po+=po&-po)
		if(val>A[po])
		{
			A[po]=val;
			P[po]=i;
		}
}
int main ()
{
	f>>n;
	for(i=1;i<=n;++i)
	{
		v[i].por=i;
		f>>v[i].val;
	}
	sort(v+1,v+n+1,cre);
	for(i=1;i<=n;++i)
	{
		++t;
		while(v[i].val==v[i+1].val)
		{
			v[i].psr=t;
			i++;
		}
		v[i].psr=t;
	}
	sort(v+1,v+n+1,ori);
	for(i=1;i<=n;++i)
	{
		ma=0;
		find(v[i].psr-1);
		len[i]=ma+1;
		come[i]=poz;
		upd(v[i].psr,len[i]);
		if(len[i]>gr)
		{
			gr=len[i];
			pma=i;
		}
	}
	ma=gr;
	g<<ma<<"\n";
	gr=ma;
	sol[ma]=v[pma].val;
	while(ma)
	{
		ma--;
		pma=come[pma];
		sol[ma]=v[pma].val;
	}
	for(i=1;i<=gr;++i)
		g<<sol[i]<<" ";
	return 0;
}