Cod sursa(job #2770220)

Utilizator bubblegumixUdrea Robert bubblegumix Data 19 august 2021 23:58:19
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
#include <set>
#include<vector>
#include <unordered_map>
#define NMAX 100010
#define lsb(x) (x&(-x))
using namespace std;
int a[NMAX];
int a2[NMAX];
int a3[NMAX];
int aib[NMAX];
int n;

ifstream f("scmax.in");
ofstream g("scmax.out");
void compressCoord()
{
	set<int> s;
	for (int i = 1; i <= n; i++)
		s.insert(a[i]);
	unordered_map<int, int> hmap;
	int idx = 0;
	for (auto it : s)
	{
		idx++;
		hmap[it]=idx;
	}
	for (int i = 1; i <= n; i++)
		a2[i] = hmap[a[i]];
}
int query(int index)
{
	int ans = 0;
	for (int i = index; i > 0; i -= lsb(i))
		ans = max(aib[i], ans);
	return ans;
}
void update(int index)
{
	int x = query(index - 1);
	for (int i = index; i <= n; i += lsb(i))
		aib[i] = max(aib[i], x + 1);
}

int main()
{
	f >> n;
	for (int i = 1; i <= n; i++)
		f >> a[i];
	compressCoord();
	for (int i = 1; i <= n; i++)
	{
		update(a2[i]);
		
	}
	int hmax = query(n);
	vector<int> sol;
	for (int i = n; i >= 1; i--)
	{
		if (query(a2[i]) == hmax)
		{
			hmax--;
			sol.push_back(i);
		}
	}
	reverse(begin(sol), end(sol));
	g << query(n) << '\n';
	for (auto it : sol)
		g << a[it] << " ";
}