Cod sursa(job #3164980)

Utilizator SilviuIIon Silviu SilviuI Data 4 noiembrie 2023 21:57:32
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
/*
ID: valenti16
LANG: C++
TASK: frac1
*/

#include <set>
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <bitset>
#include <algorithm>

#define INF 1e9

using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;

int main() 
{
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);

	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	int n;
	cin >> n;

	vector <int> in(n);

	/* Static predecessor */
	
	set <pair<int, int>> st;
	unordered_map <int, int> pred;
	unordered_map <int, vector<int>> un_mp;

	un_mp.reserve(1024);

	for (int i = 0; i < n; i++) 
	{
		cin >> in[i];

		st.insert({ in[i], i });

		un_mp[in[i]].push_back(i);
	}

	int max_in = 0;

	auto st_pn = st.begin();

	for (int i = 0; i < n; i++)
	{
		if (in[i] > in[max_in]) max_in = i;

		auto pn = st.lower_bound({ in[i], -1 });

		if (st_pn == pn) continue;

		pn--;

		pred[i] = (*pn).second;
	}

	vector <int> ans;

	while (ans.size() != n)
	{
		vector<int> cur_un_mp = un_mp[in[max_in]];

		for (auto index : cur_un_mp) 
		{
			ans.push_back(in[index]);

			if (pred.find(index) != pred.end())
			{
				max_in = pred[index];
			}
		}
	}

	reverse(ans.begin(), ans.end());

	for (auto item: ans) cout << item << ' ';
	
	return 0;
}