Cod sursa(job #903480)

Utilizator raulstoinStoin Raul raulstoin Data 1 martie 2013 21:12:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<cstdio>
#define NMAX 100005
using namespace std;
int a[NMAX],DP[NMAX],ant[NMAX],n,l;
void read()
{
	FILE *fin=fopen("scmax.in","r");
	fscanf(fin,"%d",&n);
	for(int i=1;i<=n;i++)
		fscanf(fin,"%d",&a[i]);
	fclose(fin);
}
void solve()
{
	int i,j,s,d,mid;
	DP[l=1]=1;
	for(i=2;i<=n;i++)
	{
		if(a[i]>a[DP[l]])
		{
			ant[i]=DP[l];
			DP[++l]=i;
			continue;
		}
		s=1;
		d=l;
		mid=(s+d)/2;
		while(s<d)
		{
			if(a[DP[mid]]<a[i])
				s=mid+1;
			else
				d=mid;
			mid=(s+d)/2;
		}
		if(a[DP[mid]]>a[i])
		{
			DP[mid]=i;
			ant[i]=DP[mid-1];
		}
	}
	for(i=DP[l],j=l;i;i=ant[i],j--)
		DP[j]=a[i];
}
void print()
{
	FILE *fout=fopen("scmax.out","w");
	fprintf(fout,"%d\n",l);
	for(int i=1;i<=l;i++)
		fprintf(fout,"%d ",DP[i]);
	fclose(fout);
}
int main()
{
	read();
	solve();
	print();
	return 0;
}