Cod sursa(job #1456823)

Utilizator aimrdlAndrei mrdl aimrdl Data 2 iulie 2015 01:42:58
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in;
ofstream out;
int v[100000], M[100000], pre[100000], S[100000], L = 0;

void findSub (int n) {

	for (int i = 0; i < n; ++i) {
		int lo = 1, hi = L;
		while (hi >= lo) {
			int mid = lo + (hi - lo) / 2;
			if (v[i] > v[M[mid]]) {
				lo = mid + 1;
			} else {
				hi = mid - 1;
			}
		}
		
		if (lo > L) {
			L = lo;
		}
		
		pre[i] = M[lo - 1];
		M[lo] = i;
	}
	
	int k = M[L];
	for (int i = L-1; i >= 0; --i) {
		S[i] = v[k];
		k = pre[k];
	}
}
		
int main (void) {
	in.open("scmax.in");
	out.open("scmax.out");
	
	int n;
	in >> n;
	
	for (int i = 0; i < n; ++i) {
		in >> v[i];
	}
	
	findSub(n);
	
	out << L << "\n";
	
	for (int i = 0; i < L; ++i) {
		out << S[i] << " ";
	}
	
	in.close();
	out.close();
	return 0;
}