Cod sursa(job #2487420)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 4 noiembrie 2019 19:14:55
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#define DM 100001
#define inf 0x3f3f3f3f
#include <climits>
#include <fstream>
#include <map>
#include <stack>
using namespace std;

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

int n, v[DM], p[DM], l[DM], idx[DM], lmax = 1, crt;
map <int, int> mp;
stack <int> s;

int cautbin(int x) {
	int lo = 1, hi = lmax, mid;
	while (lo < hi) {
		mid = (lo + hi)/2;
		if (v[idx[mid]] < x)
			lo = mid + 1;
		else
			hi = mid;
	}
	return hi;
}

int main() {
	fi >> n;
	v[0] = INT_MAX;
	for (int i = 1; i <= n; ++i) {
		fi >> v[i];
		crt = cautbin(v[i]);
		if (crt == lmax)
			++lmax;
		idx[crt] = i;
		mp[v[i]] = v[idx[crt-1]];
	}
	fo << lmax - 1 << '\n';
	crt = v[idx[lmax-1]];
	s.push(crt);
	for (int i = lmax - 1; i > 1; --i) {
		crt = mp[crt];
		s.push(crt);
	}
	while (!s.empty()) {
		fo << s.top() << ' ';
		s.pop();
	}
	return 0;
}