Cod sursa(job #3343124)

Utilizator www_wwwVeverita Tudor www_www Data 26 februarie 2026 15:23:04
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 30005;
int N;
int r[MAXN];
int tree[4 * MAXN];
int final[MAXN];

void build(int node, int l, int r) {
    if (l == r) {
        tree[node] = 1;
        return;
    }
    int mid = (l + r) / 2;
    build(node * 2, l, mid);
    build(node * 2 + 1, mid + 1, r);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

void update(int node, int l, int r, int pos, int val) {
    if (l == r) {
        tree[node] = val;
        return;
    }
    int mid = (l + r) / 2;
    if (pos <= mid)
        update(node * 2, l, mid, pos, val);
    else
        update(node * 2 + 1, mid + 1, r, pos, val);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

int gs(int node, int l, int r, int k) {
    if (l == r) return l;
    int mid = (l + r) / 2;
    if (k <= tree[node * 2])
        return gs(node * 2, l, mid, k);
    else
        return gs(node * 2 + 1, mid + 1, r, k - tree[node * 2]);
}

int main()
{
    ifstream fin("schi.in");
    ofstream fout("schi.out");
    fin >> N;
    for (int i = 1; i <= N; i++)
        fin >> r[i];

    build(1, 1, N);
    for (int i = N; i >= 1; i--) {
        int pos = gs(1, 1, N, r[i]);
        final[pos] = i;
        update(1, 1, N, pos, 0);
    }

    for (int i = 1; i <= N; i++)
        fout << final[i] << "\n";
    return 0;
}