Cod sursa(job #750876)

Utilizator m_mihai92Mocanu Mihai m_mihai92 Data 23 mai 2012 14:47:22
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<iostream>
#include<fstream>

using namespace std;

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

const int DIM = 100001;

int N;
int V[DIM], U[DIM], max[DIM], back[DIM], L;

void sscm()
{
	U[ 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) && V[U[now+step]]<V[i])
				now+=step;
		}
		
		max[i] = max[U[now]] + 1;
		back[i] = U[now];
		
		if(now == L)
			U[++L] = i;
			
		else
			if(V[U[now+1]] > V[i])
				U[now+1] = i;
	}
}

void write(int i)
{
	if(i!=0)
	{
		write(back[i]);
		out<<V[i]<<" ";
	}
}

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