Cod sursa(job #536729)

Utilizator deneoAdrian Craciun deneo Data 19 februarie 2011 10:17:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include<fstream>
#include<cstdio>
#include<cstdlib>
#define mare 0x3ffffffff
using namespace std;

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

typedef int vector[100001];

vector v, p, q;
int n, ng = 1;

void sol(int last, int nr)
{
	if(nr)
	for(int i = last; i > 0; --i)
		if(p[i] == nr)
		{
			sol(i-1, --nr);
			g << v[i] << ' ';
			break;
		}
}

int cautabin(int k, int poz)
{
	int i, st = 1, fn = ng, m;
	while(st <= fn)
	{
		m = (st + fn) / 2;
		if(q[m] >= k && q[m-1] < k)
		{
			q[m] = k;
			p[poz] = m;
			break;
		}
		else if(q[m] >= k)
			fn = m;
		else
			st = m + 1;
	}
	if(st > fn)
	{
		p[poz] = ng;
		q[ng++] = k;
	}
}

int main()
{
	int i, l;
	f >> n;
	for(i = 1; i <= n; ++i)
	{
		f >> v[i];
		cautabin(v[i], i);
	}
	g << --ng << '\n';
	sol(n, ng);
	g << '\n';
	g.close();
	return 0;
}