Cod sursa(job #2660253)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 18 octombrie 2020 17:06:17
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
typedef long long ll;
const ll NMAX = 100001;
ll n, aint[4 * NMAX], v[NMAX], d[NMAX], ma;
vector<ll> b;
void build(ll nod, ll l, ll r) {
	if (l == r) {
		aint[nod] = 0;
		return;
	}
	ll mj = (l + r) / 2;
	build(nod * 2, l, mj);
	build(nod * 2 + 1, mj + 1, r);
	aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
void update(ll nod, ll l, ll r, ll poz, ll val) {

	if (l == r) {
		aint[nod] = val;
		return;
	}
	ll mj = (l + r) / 2;
	if (poz > mj)
		update(nod * 2 + 1, mj + 1, r, poz, val);
	else
		update(nod * 2, l, mj, poz, val);
	aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
ll query(ll nod, ll l, ll r, ll x, ll y) {
	if (l >= x && r <= y) {
		return aint[nod];
	}
	ll mj = (l + r) / 2;
	ll s1 = 0, s2 = 0;
	if (x <= mj)
		s1 = query(nod * 2, l, mj, x, y);
	if (y > mj)
		s2 = query(nod * 2 + 1, mj + 1, r, x, y);
	return max(s1, s2);///max(aint[nod], max(s1, s2));

}

int main() {
	fin >> n;
	for (ll i = 1; i <= n; ++i) {
		fin >> v[i];
		b.push_back(v[i]);
	}
	build(1, 1, n);
	sort(b.begin(), b.end());
	b.erase(unique(b.begin(), b.end()), b.end());
	for (ll i = 1; i <= n; ++i)
		v[i] = lower_bound(b.begin(), b.end(), v[i]) - b.begin() + 1;
	d[1] = 1;
	update(1, 1, n, v[1], d[1]);
	for (ll i = 2; i <= n; ++i) {
		if (v[i] - 1 >= 1)
			ma = query(1, 1, n, 1, v[i] - 1);
		d[i] = ma + 1;
		update(1, 1, n, v[i], d[i]);
	}
	ll ma = 0;
	for (ll i = 1; i <= n; ++i)
		ma = max(ma, d[i]);
	fout << ma;
}