Pagini recente » Cod sursa (job #3151637) | Cod sursa (job #2391626) | Cod sursa (job #603424) | Cod sursa (job #2485547) | Cod sursa (job #2917081)
#include <bits/stdc++.h>
using namespace std;
struct Pair {
int node;
long long val;
bool operator < (Pair o) const {
if(val != o.val) {
return val < o.val;
} else {
return node < o.node;
}
}
};
int const NMAX = 1000000;
int n;
int f[1 + NMAX];
long long ans[1 + NMAX];
long long len[1 + NMAX];
int le[1 + NMAX], ri[1 + NMAX];
void dfs(int from, long long val, long long dist) {
if(le[from] <= n) {
ans[le[from]] = 2*val;
len[le[from]] = dist+1;
} else {
dfs(le[from], 2*val, dist+1);
}
if(ri[from] <= n) {
ans[ri[from]] = 2*val+1;
len[ri[from]] = dist+1;
} else {
dfs(ri[from], 2*val+1, dist+1);
}
}
int main() {
cin >> n;
set<Pair> s;
for(int i = 1; i <= n; i++) {
cin >> f[i];
s.insert({i, f[i]});
}
int index = n+1;
for(int i = 1; i <= n-1; i++) {
Pair p1 = *s.begin();
s.erase(s.begin());
Pair p2 = *s.begin();
s.erase(s.begin());
le[index] = p1.node;
ri[index] = p2.node;
s.insert({index, p1.val + p2.val});
index++;
}
int root = (*s.begin()).node;
dfs(root, 0, 0);
for(int i = 1; i <= n; i++) {
cout << len[i] << " " << ans[i] << "\n";
}
}