Cod sursa(job #750040)

Utilizator teodora.petrisorPetrisor Teodora teodora.petrisor Data 20 mai 2012 10:57:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<iostream>
#include<fstream>

using namespace std;

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

const int MAXN = 100005;

int N;
int A[MAXN], B[MAXN], best[MAXN], parent[MAXN], L;

void solve()
{
	B[ L = 0 ] = 0;
	
	int pow = 1, i, now, step;
	
	for(i = 1; i <= N; i++)
	{
		while((pow << 1) <= L) pow <<= 1;
		
		now = 0;
		
		for(step = pow; step; step >>= 1)
		{
			if((now + step <= L) && A[B[now+step]]<A[i])
				now+=step;
		}
		
		best[i] = best[B[now]] + 1;
		parent[i] = B[now];
		
		if(now == L)
			B[++L] = i;
			
		else
			if(A[B[now+1]] > A[i])
				B[now+1] = i;
	}
}

void write(int i)
{
	if(!i) return;
	write(parent[i]);
	out<<A[i]<<" ";
}

int main()
{
	int i;
	in>>N;
	
	for(i = 1; i<= N; ++i)
		in>>A[i];
	
	solve();
	
	out<<L<<"\n";
	
	for(i=1; i<=N; i++)
		if(best[i] == L)
		{
			write(i);
			return 0;
		}
		
	return 0;
}