Cod sursa(job #1000977)

Utilizator DraStiKDragos Oprica DraStiK Data 24 septembrie 2013 10:27:49
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <vector>
#include <fstream>
using namespace std;

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

vector<int> V, best, ant;

int binary_search(int st, int dr, int poz) {
    if (V[best[dr-1]] < V[poz])
		return dr;
	--dr;

	int sol = 0;
	while (st <= dr) {
		int mij = (st + dr) / 2;

		if (V[best[mij]] < V[poz]) {
			sol = mij;
			st = mij + 1;
		}
		else
			dr = mij - 1;
	}
	
	return sol;
}

void print(int value) {
	if(ant[value] > 0)
		print(ant[value]);
	fout<< V[value] << " ";
	
}

int main() {
	int N; fin >> N;
	
	V.resize(N); 
	ant.resize(N); 
	best.resize(N);
	
	for(int i = 0; i < N; ++i)
		fin >> V[i];
	for(int i = 0; i < N; ++i)
		ant[i] = -1;

	int bestLg = 1;
	for(int i = 1; i < N; ++i) {
		int index = binary_search(0, bestLg, i);

		if(index == bestLg) {
			best[bestLg++] = i;
			ant[i] = best[bestLg - 2];
		}
		else {
			if(V[i] < V[best[bestLg - 1]])
				best[bestLg - 1] = i;
				if(bestLg - 2 >= 0)
					ant[i] = best[bestLg - 2];
		}
	}

	fout << bestLg << "\n";
	print(best[bestLg - 1]);

    return 0;
}