Cod sursa(job #2956258)

Utilizator TheGodFather2131Alexandru Miclea TheGodFather2131 Data 18 decembrie 2022 20:32:32
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
//ALEXANDRU MICLEA

#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>
#include <iostream>
#include <array>
#include <fstream>

//typedef long long ll;
//typedef unsigned long long ull;
//typedef long double ld;;
//typedef pair <int, int> pii;
//typedef pair <ll, ll> pll;
//typedef pair <double, double> pdd;
//typedef vector<ll> vll;
//typedef vector<int> vi;
//typedef vector<vector<int> > vvi;
//typedef vector<vector<ll> > vvll;
//typedef vector<vector<pll> > vvpll;
//typedef vector<pll> vpll;
//typedef vector<pii> vpii;
//const ll MOD = 1e9 + 7;
//double eps = 1e-6;
//#define forn(i,e) for(ll i = 1; i <= e; i++)
//#define for0n(i,e) for(ll i = 0; i < (e); i++)
//#define forsn(i,s,e) for(ll i = s; i <= e; i++)
//#define rforn(i,s) for(ll i = s; i >= 1; i--)
//#define rfor0n(i,s) for(ll i = s; i >= 0; i--)
//#define rforsn(i,s,e) for(ll i = s; i >= e; i--)
//#define ln "\n"
//#define dbg(x) fout<<#x<<" = "<<x<<ln
//#define mp make_pair
//#define pb push_back
//#define fi first
//#define se second
//#define llinf 2e18
//#define iinf 1e9
//#define all(x) (x).begin(), (x).end()
//#define sz(x) ((ll)(x).size())



using namespace std;

ifstream fin("schi.in"); ofstream fout("schi.out");
//ifstream fin("input.in"); ofstream fout("output.out");

//VARIABLES

int v[100005];
int ans[100005];
int arb[400005];

//FUNCTIONS

void init(int nod, int st, int dr, int pos) {
    if (st == dr) {
        arb[nod] = 1;
        return;
    }

    int mid = (st + dr) / 2;

    if (pos <= mid) {
        init(nod * 2, st, mid, pos);
    }
    else {
        init(nod * 2 + 1, mid + 1, dr, pos);
    }

    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

void update(int nod, int st, int dr, int pos, int val) {
    if (st == dr) {
        arb[nod] = 0;
        ans[st] = val;
        return;
    }

    int mid = (st + dr) / 2;
    if (pos <= arb[nod * 2]) {
        update(nod * 2, st, mid, pos, val);
    }
    else {
        update(nod * 2 + 1, mid + 1, dr, pos - arb[nod * 2], val);
    }

    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

//MAIN
int main() {

    int n; fin >> n;
    for (int i = 1; i <= n; i++) {
        fin >> v[i];
        init(1, 1, n, i);
    }

    for (int i = n; i >= 1; i--) {
        update(1, 1, n, v[i], i);
    }

    for (int i = 1; i <= n; i++) fout << ans[i] << '\n';

    return 0;
}