Cod sursa(job #414979)

Utilizator al_flAlexandru Flavian al_fl Data 10 martie 2010 19:36:11
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<stdio.h>
#define MAX 100003
int M[MAX],p[MAX],v[MAX],nr,n,best[MAX],maxim;
FILE*g=fopen("scmax.out","w");
void afis(int poz)
{
	if(poz>0){afis(p[poz]);
	fprintf(g,"%d ",v[poz]);}
}
int cauta(int x)
{
	int lo=0,hi=nr,mid=(lo+hi)/2;
	while(lo<=hi)
	{
		if(v[M[mid]]<x&&v[M[mid+1]]>=x)return mid;
		else if(v[M[mid+1]]<x){lo=mid+1;mid=(lo+hi)/2;}
			else{hi=mid-1;mid=(lo+hi)/2;}
	}
	return nr;
}
int main()
{
	FILE*f=fopen("scmax.in","r");
	fscanf(f,"%d",&n);

	int i,poz,maxP;

	for(i=1;i<=n;++i)
	fscanf(f,"%d",&v[i]);
	fclose(f);

	best[1]=M[1]=nr=1;
	maxim=maxP=1;
	for(i=2;i<=n;++i)
	{
		poz=cauta(v[i]);
		p[i]=M[poz];
		best[i]=poz+1;
		if(best[i]>maxim)
		{maxim=best[i];maxP=i;}
		M[poz+1]=i;
		if(nr<poz+1)nr=poz+1;
	}
	fprintf(g,"%d\n",maxim);
	afis(maxP);
	fclose(g);
	return 0;
}