Pagini recente » Cod sursa (job #1598366) | Cod sursa (job #211082) | Cod sursa (job #529622) | Cod sursa (job #652597) | Cod sursa (job #637595)
Cod sursa(job #637595)
#include<fstream>
using namespace std;
const int MAXN = 30010;
short place[MAXN], contestant[MAXN];
const int MAXNT = 65536;
short tree[MAXNT], leaf[MAXNT];
void buildTree(int pos, int left, int right) {
tree[pos] = right - left + 1;
if (left < right) {
int m = (left + right)/2;
buildTree(pos*2, left, m);
buildTree(pos*2+1, m+1, right);
} else {
leaf[pos] = left;
}
}
int query(int pos, int val, int left, int right) {
if (left == right) {
tree[pos] = 0;
return leaf[pos];
}
int result = 0;
if (val <= tree[2*pos]) {
result = query(2*pos, val, left, (left+right)/2);
tree[pos]--;
} else {
result = query(2*pos+1, val-tree[2*pos], (left+right)/2+1, right);
tree[pos]--;
}
return result;
}
int main() {
ifstream f("schi.in");
ofstream g("schi.out");
int n;
f >> n;
for (int i = 1; i <= n; i++) {
f >> place[i];
}
buildTree(1, 1, n);
for (int i = n; i >= 1; i--) {
int x = query(1, place[i], 1, n);
contestant[x] = i;
}
for (int i = 1; i <= n; i++) {
g << contestant[i] << '\n';
}
return 0;
}