Cod sursa(job #750466)

Utilizator stanescu_teodorStanescu Teodor stanescu_teodor Data 22 mai 2012 10:32:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#define inf 2000000010
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
int a[100020],Q[100020],p[100020],mx,pz,l,u,n,i;

int cb (int x,int Q[],int st,int dr)
{
	int mij,pz;
	pz=0;
	while (st<=dr && !pz)
	{
		mij=(st+dr)/2;
		if (Q[mij]==x) pz=mij;
		else
			if (Q[mij]>x) dr=mij-1;
		else st=mij+1;
	}
	if (!pz) 
	{
		pz = st;
		if (st > l) l++;
	}
	Q[pz] = x;
	return pz;
}

void scriere (int u,int i,int lg)
{
	if (i>0)
	{
		if (a[i] < u && p[i] == lg)
		{
			scriere (a[i],i - 1, lg - 1);
			g << a[i] << ' ';
		}
		else scriere (u	, i-1 , lg);
	}
}

int main ()
{
	f>>n;
	for (i=1; i<=n; i++)
		f >>a[i];
	l=1; Q[1]=a[1]; mx=1; pz=1; p[1]=1;
	for (i=2; i<=n; i++)
	{
		p[i]=cb(a[i],Q,1,l);
		if (l > mx)
		{
			mx = l;
			pz = i;			
		}
	}
	u=inf;
	g << mx << endl;
	scriere (u, pz, mx);
	f.close();
	g.close();
	return 0;
}