Cod sursa(job #1146512)

Utilizator iarbaCrestez Paul iarba Data 19 martie 2014 08:10:31
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
using namespace std;
int x[100001],y[100001],arb[1<<18];
int i,j,n,t,poz,maxim,v;
int max(int a, int b){if(a>b){return a;}return b;}
int cauta(int st, int sf)
{
	if(st==sf){return st;}
	else{
		int piv=(st+sf+1)/2;
		if(y[piv]>=t){return cauta(st,piv-1);}
		return cauta(piv,sf);
		}
}
void sort(int st, int sf)
{
	int piv=y[(st+sf)/2],i=st,j=sf,aux;
	while(i<=j){
		while(y[i]<piv){i++;}
		while(y[j]>piv){j--;}
		if(i<=j){
			aux=y[i];
			y[i]=y[j];
			y[j]=aux;
			i++;j--;
			   }
			  }
	if(st<j){sort(st,j);}
	if(sf>i){sort(i,sf);}
}
void query(int nod, int st, int sf)
{
	if(poz>=sf){maxim=max(maxim,arb[nod]);}
	else{
		int piv=(st+sf)/2;
		query(2*nod,st,piv);
		if(piv<poz){query(2*nod+1,piv+1,sf);}
		}
}
void update(int nod, int st, int sf)
{
	if(st==sf){arb[nod]=v;}
	else{
		int piv=(st+sf)/2;
		if(poz+1<=piv){update(nod*2,st,piv);}
		else{update(nod*2+1,piv+1,sf);}
		if(arb[nod*2]>=arb[nod*2+1]){arb[nod]=arb[nod*2];}
		else{arb[nod]=arb[nod*2+1];}
		}
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%ld",&n);
	for(i=1;i<=n;i++){
		scanf("%ld",&x[i]);
		y[i]=x[i];
					 }
	sort(1,n);
	for(i=1;i<=n;i++){
		t=x[i];
		poz=cauta(0,n);
		maxim=0;
		if(poz){query(1,1,n);}
		v=maxim+1;
		update(1,1,n);
					 }
	i=n+1;poz=n;maxim=0;query(1,1,n);printf("%ld\n",maxim);
return 0;
}