Cod sursa(job #931659)

Utilizator harababurelPuscas Sergiu harababurel Data 28 martie 2013 13:41:38
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
//o(n log n) cu ideea lui francu
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 100005
using namespace std;

int n, m;
vector <int> q, sol;
int v[nmax], h[nmax];

void insert(int i) {
	int val = v[i], lo, hi, mid;
	lo = -1;
	hi = q.size();

	while(hi - lo > 1) {
		mid = lo + (hi - lo) / 2;
		if(val >= q[mid]) lo = mid;
		else hi = mid;
	}
	if(hi == q.size()) q.push_back(val);
	else q[hi] = val;
	
	h[i] = hi + 1;
}
		

int main() {
	ifstream f("scmax.in");
	ofstream g("scmax.out");

	f>>n;
	for(int i=1; i<=n; i++) {
		f>>v[i];
		insert(i);
		//cout<<"l-am pus pe "<<v[i]<<" si am obtinut ";
		//if(v[i] < 10) cout<<" ";
		//for(int j=0; j<q.size(); j++) cout<<q[j]<<" "; cout<<"\n";
	}

	int dim = q.size();
	g<<dim<<"\n";
	cout<<dim<<"\n";


	int l = dim, i = n;

	while(l > 0) {
		while(h[i] != l) i--;
		sol.push_back(v[i]);
		l--;
	}
	for(i=sol.size()-1; i>=0; i--) g<<sol[i]<<" ";

	return 0;
}