Cod sursa(job #2770324)

Utilizator bubblegumixUdrea Robert bubblegumix Data 20 august 2021 15:13:29
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream>
#include<algorithm>
#include <vector>
#define NMAX 100010
using namespace std;
using ll = long long;
ll t[4 * NMAX];
pair<int,ll> v[NMAX];
int v1[NMAX];
int d[NMAX];
int n;
ifstream f("scmax.in");
ofstream g("scmax.out");
int query(int u, int l, int r, int ql, int qr)
{
	if (l > qr || r < ql)
		return 0;
	if (l >= ql && r <= qr)
		return t[u];
	int m = (l + r) / 2;
	return max(query(u << 1, l, m, ql, qr), query(u << 1 | 1, m + 1, r, ql, qr));
}
void build(int u, int l, int r, int pos, int val)
{
	if (l == r)
	{
		t[u] = val;
		return;
	}
	if (pos<l || pos>r)
		return;
	int m = (l + r) / 2;
	build(u << 1, l, m, pos, val);
	build(u << 1|1, m+1, r, pos, val);
	t[u] = max(t[u << 1], t[u << 1 | 1]);
}
int main()
{
	f >> n;
	for (int i = 1; i <= n; i++)
		f >> v[i].first, v[i].second = i,v1[i]=v[i].first;
	sort(v + 1, v + n + 1, [](pair<int, ll> a, pair<int, ll> b) {

		if (a.first == b.first)
			return a.second > b.second;

		return a.first < b.first;
		});
	int hmax=-1;
	int poz=-1;
	for (int i = 1; i <= n; i++)
	{
		int val = query(1,1, n, 1, v[i].second-1) + 1;
		build(1, 1, n, v[i].second, val);
		if (val > hmax)
		{
			hmax = val;
			poz = v[i].second;
		}
		d[v[i].second] = val;
	}

	vector<int> sol;
	for(int i=poz;i>=1;i--)
		if (d[i] == hmax)
		{
			sol.push_back(i);
			hmax--;
		}
	
	g << t[1]<<'\n';
	for (int i = sol.size() - 1; i >= 0; i--)
		g << v1[sol[i]] << " ";
}