Cod sursa(job #403035)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 24 februarie 2010 15:24:44
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

int ai[500000],val,poz,start,stop,maxim;

int max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}

void update(int nod,int st,int dr)
{
	int div;

	if(st==dr)
		ai[nod]=val;
	else
	{
		div=(st+dr)/2;
		if(poz<=div)
			update(2*nod+1,st,div);
		else
			update(2*nod+2,div+1,dr);
		ai[nod]=max(ai[2*nod+1],ai[2*nod+2]);
	}
}

void query(int nod,int st,int dr)
{
	int div;

	if(start<=st && dr<=stop)
	{
		if(ai[nod]>maxim)
			maxim=ai[nod];
	}
	else
	{
		div=(st+dr)/2;
		if(start<=div)
			query(2*nod+1,st,div);
		if(stop>div)
			query(2*nod+2,div+1,dr);
	}
}

int main()
{
	int n,v[100000],v1[100000],rez=1,best[100000],i;
	FILE *f=fopen("scmax.in","r");

	fscanf(f,"%i",&n);
	for(i=0;i<n;i++)
		fscanf(f,"%i",v+i);
	fclose(f);
	memcpy(v1,v,sizeof(v));

	//Normalizare v
	sort(v1,v1+n);	
	for(i=0;i<n;i++)
	{
		v[i]=lower_bound(v1,v1+n,v[i])-v1;
		best[v[i]]=1;
		val=1;
		poz=v[i];
		update(0,0,n-1);
	}

	for(i=1;i<n;i++)
	{
		start=0;
		stop=v[i]-1;
		if(stop>=start)
		{
			query(0,0,n-1);
			if(1+maxim>best[v[i]])
			{
				best[v[i]]=1+maxim;
				val=best[v[i]];
				poz=v[i];
				update(0,0,n-1);
				if(val>rez)
					rez=val;
			}
		}
	}
	f=fopen("scmax.out","w");
	fprintf(f,"%i\n",rez);
	fclose(f);
	return 0;
}