Cod sursa(job #705447)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 4 martie 2012 12:53:15
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
//cu arbori de intervale
#include <fstream>
#include <algorithm>
using namespace std;
int arb[700002],poz[700002],i,x,a[100002],p[100002],v[100002],b[100002],prev[100002],pmax,n,y,maxim,val,maxarb;

void query(int nod,int l,int r)
{
	if(l>=x and r<=y)
	{
		if(val<arb[nod]) { val=arb[nod]; maxarb=poz[nod]; } 
		return;
	}
	int m=(r+l)/2;
	if(x<=m) query(2*nod,l,m);
	if(y>m) query(2*nod+1,m+1,r);
}
void update(int nod,int l,int r)
{
	if(l==r)
	{
		arb[nod]=x;
		poz[nod]=i;
		return;
	}
	int m=(l+r)/2;
	if(a[i]<=m) update(2*nod,l,m);
	if(a[i]>m) update(2*nod+1,m+1,r);
	if(arb[2*nod]>arb[2*nod+1]) {arb[nod]=arb[2*nod]; poz[nod]=poz[2*nod]; }
						  else {arb[nod]=arb[2*nod+1]; poz[nod]=poz[2*nod+1]; }
}
int main()
{
	ifstream fi("scmax.in");
	ofstream fo("scmax.out");
	fi>>n;
	for(i=1;i<=n;i++)
	{
		fi>>a[i];
		b[i]=v[i]=p[i]=a[i];
	}
	sort(p+1,p+n+1);
	for(i=1;i<=n;i++) if(p[i]==p[i-1]) v[i]=v[i-1]; else v[i]=v[i-1]+1;
	for(i=1;i<=n;i++)
	{
		x=lower_bound(p+1,p+n+1,a[i])-p;
		a[i]=v[x];
	}
	maxim=1;
	for(i=1;i<=n;i++)
	{
		val=0;
		x=1; y=a[i]-1;
		if(y>=x) query(1,1,v[n]);
		if(val!=0) prev[i]=maxarb; else prev[i]=i;
		x=max(1,val+1);
		if(x>maxim){ maxim=x; pmax=i; }
		update(1,1,v[n]);
	}
	fo<<maxim<<"\n";
	int sol=0;
	for(i=pmax;prev[i]!=i;i=prev[i]) a[++sol]=b[i];
	a[++sol]=b[prev[i]];
	for(i=sol;i>0;i--) fo<<a[i]<<" ";
	fo<<"\n";	
	return 0;
}