Cod sursa(job #546823)

Utilizator Catah15Catalin Haidau Catah15 Data 5 martie 2011 15:48:46
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
// SCMAX N log N

#include <fstream>
#include <vector>

using namespace std;

#define maxN 100005

long long x[maxN];
int best[maxN], dim, poz[maxN], maxim, N, ant[maxN], pozz;
vector < int > sol;


int bin_Search(int st, int dr, int z)
{
	int mid;
	
	while(st < dr)
	{
		mid = (st + dr) / 2;
		
		if(x[poz[mid]] > z)
			dr = mid;
		
		if(x[poz[mid]] <= z)
			st = mid + 1;
	}

	mid = (st + dr) / 2;

	if(x[poz[mid]] >= z)
		--mid;

	return mid;
}


int main()
{
	ifstream f("scmax.in");
	ofstream g("scmax.out");
	
	f >> N;
	
	for (int i = 1; i <= N; ++ i)
	{
		f >> x[i];
		
		int p = bin_Search(0, dim, x[i]);
		
		poz[p + 1] = i;
		
		best[i] = p + 1;
		
		ant[i] = poz[p];
		
		if (p + 1 > dim)
			dim = p + 1;
		
		if (best[i] > maxim)
		{
			maxim = best[i];
			pozz = i;
		}
	}
	
	g << maxim << '\n';
	
	sol.push_back(x[pozz]);
	
	for (int i = pozz; ant[i] != 0; i = ant[i])
		sol.push_back(x[ant[i]]);
	
	for (int i = sol.size() - 1; i >= 0; -- i)
		g << sol[i] << " ";
	
}