Cod sursa(job #887945)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 24 februarie 2013 10:10:32
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<iostream>
#include<vector>
#include<fstream>
#include<algorithm>
using namespace std;

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

const int N = 110000;

int n, x[N], p[N], s[N], pmax, aib[N], prec[N], pr[N];
vector<int> rez;

inline int query(int poz) {
	int r = 0;
	for(; poz; poz -= poz & (-poz)) {
		if(aib[poz] > r)
			pmax = pr[poz];
		r = max(r, aib[poz]);
	}
	return r;
}
inline void update(int poz, int val, int po) {
	for(; poz <= n; poz += poz & (-poz)) {
		if(val > aib[poz])
			pr[poz] = po;
		aib[poz] = max(aib[poz], val);
	}
}

bool cmp(int a, int b) {
	return x[a] < x[b];
}

int main() {
	int i;
	
	in >> n;
	
	for(i = 1; i<=n; ++i)
		in >> x[i], p[i] = i;
	
	sort(p + 1, p + n + 1, cmp);
	int smax = 0, pm;
	for(i = 1; i<=n; ++i) {
		pmax = 0;
		int t = query(p[i]);
		
		s[p[i]] = t + 1;
		prec[p[i]] = pmax;
		update(p[i], t + 1, p[i]);
		
		if(s[p[i]] > smax) {
			smax = s[p[i]];
			pm = p[i];
		}
	}
	
	out << s[pm] << "\n";
	int t = pm;
	while(t > 0) {
		rez.push_back(x[t]);
		t = prec[t];
	}
	
	for(i = rez.size() - 1; i >= 0; --i)
		out << rez[i] << " ";
	
	return 0;
}