Cod sursa(job #2626959)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 9 iunie 2020 11:22:04
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, len, v[100100], aib[400100], ant[100100], sol[100100];

void update(int nod, int st, int dr, int poz, int value) {
	if (st == dr) {
		aib[nod] = value;
		return;
	}

	int mij = (st + dr) / 2;
	if (poz <= mij)
		update(2 * nod, st, mij, poz, value);
	else
		update(2 * nod + 1, mij + 1, dr, poz, value);

	aib[nod] = max(aib[2 * nod], aib[2 * nod + 1]);
}

int query(int nod, int st, int dr, int value) {
	if (st == dr)
		return st;

	int mij = (st + dr) / 2;
	if (aib[2 * nod + 1] == 0)
		return query(2 * nod, st, mij, value);
	if (value <= aib[2 * nod + 1])
		return query(2 * nod, st, mij, value);
	return query(2 * nod + 1, mij + 1, dr, value);
}

void afisare(int x) {
	if (x == 0)
		return;
	afisare(ant[x]);
	fout << x << ' ';
}

int main() {
	fin >> n;
	for (int i = 1; i <= n; i++)
		fin >> v[i];

	for (int i = 1; i <= n; i++) {
		int poz = query(1, 0, n, v[i]);
		len = max(len, poz + 1);
		if (v[i] <= sol[poz + 1] || len == poz + 1) {
			ant[v[i]] = sol[poz];
			sol[poz + 1] = v[i];
			update(1, 0, n, poz + 1, v[i]);
		}
	}

	fout << len << '\n';
	afisare(sol[len]);
    return 0;
}