#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using pl = pair<ll,ll>;
using pii = pair<int,int>;
using tpl = tuple<int,int,int>;
#define all(a) a.begin(), a.end()
#define filter(a) a.erase(unique(all(a)), a.end())
vector<int> mergeVector (const vector<int> &a, const vector<int> &b) {
int cur = 0;
vector<int> ans;
for (int i = 1; cur < max(a.size(), b.size()); cur += i, i <<= 1) {
for (int j = cur; j < cur + i && j < a.size(); j++) ans.push_back(a[j]);
for (int j = cur; j < cur + i && j < b.size(); j++) ans.push_back(b[j]);
}
return ans;
}
const int mn = 2e5 + 5;
int a[mn], n;
vector<int> solve (int u) {
if (u > n) return vector<int>(0);
int nodeL = u << 1, nodeR = u << 1 | 1;
vector<int> ans;
// keep everything as it is
if (a[u] < min(a[nodeL], a[nodeR])) {
ans = mergeVector(solve(nodeL), solve(nodeR));
ans.insert(ans.begin(), a[u]);
}
// if left subtree is choosen -> just do it
else if (a[nodeL] < a[nodeR]) {
swap(a[u], a[nodeL]);
ans = mergeVector(solve(nodeL), solve(nodeR));
ans.insert(ans.begin(), a[u]);
swap(a[u], a[nodeL]);
}
// if right subtree is choosen -> consider 2 cases
else if (a[nodeL] > a[nodeR]) {
swap(a[u], a[nodeR]);
vector<int> candL = mergeVector(solve(nodeL), solve(nodeR));
candL.insert(candL.begin(), a[u]);
swap(a[nodeL], a[nodeR]);
vector<int> candR = mergeVector(solve(nodeL), solve(nodeR));
candR.insert(candR.begin(), a[u]);
swap(a[nodeL], a[nodeR]);
swap(a[u], a[nodeR]);
ans = min(candL, candR);
}
else ans.push_back(a[u]);
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = n + 1; i <= 2 * n + 1; i++) a[i] = INT_MAX;
vector<int> ans = solve(1);
for (int u : ans) cout << u << " ";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |