Cod sursa(job #749529)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 17 mai 2012 16:48:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 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], tata[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;
		tata[i] = B[now];
		
		if(now == L)
			B[ ++L ] = i;
		else
			if(A[ B[now + 1] ] > A[i])
				B[now + 1] = i;
		}
	}
}

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

int main()
{
	int i, j;
	
	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){
			scrie(i);
			return 0;
		}
		
	return 0;
}