Cod sursa(job #744719)

Utilizator geniucosOncescu Costin geniucos Data 9 mai 2012 15:20:20
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int poz,maxi,v2,nr,p,u,m,n,i,arb[200002],l[100002],d[100002],a[100002],v1[100002],v[100002];
void update(int nod,int st,int dr,int poz,int val)
{
	if(st==dr)
	{
		arb[nod]=max(arb[nod],val);
		return ;
	}
	int mij=(st+dr)/2;
	if(mij>=poz)
		update(nod*2,st,mij,poz,val);
	else 
		update(nod*2+1,mij+1,dr,poz,val);
	arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
int q(int nod,int st,int dr,int poz)
{
	if(st>=1&&poz>=dr) return arb[nod];
	int mij=(st+dr)/2;
	int v=0;
	if(1<=mij)
		v=max(v,q(nod*2,st,mij,poz));
	if(poz>mij)
		v=max(v,q(nod*2+1,mij+1,dr,poz));
	return v;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
	scanf("%d",&a[i]);
	v1[i]=a[i];
}
sort(v1+1,v1+n+1);
nr=1;
v[nr]=v1[1];
for(i=2;i<=n;i++)
	if(v1[i]!=v1[i-1])
	{
		nr++;
		v[nr]=v1[i];
	}
for(i=1;i<=n;i++)
{
	p=1;
	u=nr;
	while(p<=u)
	{
		m=(p+u)/2;
		if(v[m]>a[i]) u=m-1;
		else
		if(v[m]<a[i]) p=m+1;
		else break;
	}
	d[i]=m;
}
for(i=1;i<=n;i++)
{
	if(d[i]>1) l[i]=1+q(1,1,n,d[i]-1);
	else l[i]=1;
	if(l[i]>maxi)
	{
		maxi=l[i];
		poz=i;
	}
	update(1,1,n,d[i],l[i]);
}
//for(i=1;i<=n;i++)
	//printf("%d ",l[i]);
printf("%d\n",maxi);
v2=maxi-1;
v1[v2+1]=a[poz];
for(i=poz-1;i>=1;i--)
	if(l[i]==v2&&a[i]<v1[v2+1])
	{
		v1[v2]=a[i];
		v2--;
	}
for(i=1;i<=maxi;i++)
	printf("%d ",v1[i]);
return 0;
}