Cod sursa(job #700882)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 1 martie 2012 12:25:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
#define NMAX 100010
#define INF 2000000100

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int a[NMAX], lg[NMAX], pz[NMAX], b[NMAX], bpz[NMAX], n, m;

void Citeste()
{
	int i;
	f>>n;
	for (i=1; i<=n; ++i) { f>>a[i]; b[i]=INF;}
}

int cauta(int x)
{
	int st=1, dr=m, j=m, mij, ok=0;
	while (st<=dr && !ok)
	{
		mij=(st+dr)>>1;
		if (b[mij]==x) ok=mij;
		else if (b[mij]<x) st=mij+1;
			else dr=mij-1, j=mij;
	}
	if (ok!=0) return -ok;
	else return j;
}

void Scrie(int x)
{
	if (pz[x])
	{
		Scrie(pz[x]);
		g<<a[x]<<" ";
	}
	if (!pz[x]) g<<a[x]<<" ";
}

void Solve()
{
	int i, mx=-1, im, c;
	m=1;
	for (i=1; i<=n; ++i)
	{
		c=cauta(a[i]);
		if (c==m) ++m;
		if (c>0)
		{
			b[c]=a[i]; b[m]=INF;
			bpz[c]=i; lg[i]=c; pz[i]=bpz[c-1];
			if (c>mx) mx=c, im=i;
		}
	}
	g<<mx<<"\n";
	Scrie(im);
	g<<"\n";
}

int main()
{
	Citeste();
	Solve();
	f.close();
	g.close();
	return 0;
}