Cod sursa(job #1468793)

Utilizator greenadexIulia Harasim greenadex Data 6 august 2015 23:51:55
Problema Subsir crescator maximal Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
#define pii pair<int, int>
#define mp make_pair

using namespace std;

const string name = "scmax",
	     in_file = name + ".in", 
	     out_file = name + ".out";

ifstream fin(in_file);
ofstream fout(out_file);

const int MAX = 1e5 + 5;

int v[MAX], aib[MAX], n, sol, old[MAX];
pii aux[MAX];
vector<int> mia;

int lsb(int x){
	return x & (-x);
}

void update(int poz, int val){
	for (int i = poz; i <= n; i += lsb(i))
		aib[i] = max(val, aib[i]);
}

int query(int poz){
	int ret = 0;
	for (int i = poz; i >= 1; i -= lsb(i))
		ret = max(aib[i], ret);
	return ret;
}

int main(){
	fin >> n;
	for (int i = 1; i <= n; i++){
		fin >> v[i];
		pii elem = mp(v[i], i);
		aux[i] = elem;
	}
	sort(aux + 1, aux + n + 1);

	old[1] = v[aux[1].s];
	v[aux[1].s] = 1;

	for (int i = 2; i <= n; i++){
		int temp = v[aux[i - 1].s];
		if (aux[i].f != aux[i - 1].f){
			temp++;
			old[temp] = aux[i].f;
		}
		v[aux[i].s] = temp;
	}

	for (int i = 1; i <= n; i++){
		int temp = 1 + query(v[i] - 1);
		sol = max(sol, temp);
		update(v[i], temp);
	}

	fout << sol << '\n';

	for (int i = n; i >= 1 && sol; i--)
		if (query(v[i]) == sol){
			mia.pb(v[i]);
			sol--;
		}

	while (mia.size()){
		fout << old[mia.back()] << ' ';
		mia.pop_back();
	}

	return 0;
}