Pagini recente » Cod sursa (job #2612464) | Cod sursa (job #3182607) | Cod sursa (job #4647) | Cod sursa (job #381252) | Cod sursa (job #3164979)
/*
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(2048);
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;
}