Cod sursa(job #3367834)

Utilizator Rradu_v2Catana Radu Rradu_v2 Data 11 octombrie 2026 11:50:55
Problema Schi Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>

#define MAXN 30001
int v[MAXN];
int aib[MAXN];
int r[MAXN];

int update(int pos, int val) {
    while(pos<MAXN) {
        aib[pos] += val;
        pos += pos&(-pos);
    }
}

int sum(int pos) {
    int s=0;
    while(pos>0) {
        s += aib[pos];
        pos -= pos&(-pos);
    }
    return s;
}

int findrank(int st, int dr, int val) {
    int mij=(st+dr)/2;
    int bef = sum(mij);
    //printf("%d %d %d %d %d\n", st, bef, mij, dr, val);
    if(mij-bef>=val) {
        if(mij-st>0)
            return findrank(st, mij-1, val);
        else
            return mij;
    }
    else {
        if(dr-mij>0)
            return findrank(mij+1, dr, val);
        else
            return mij+1;
    }
}

int main() {
    FILE *fin = fopen("schi.in", "r");
    FILE *fout = fopen("schi.out", "w");

    int n;
    fscanf(fin, "%d", &n);

    for(int i=1; i<=n; i++) 
        fscanf(fin, "%d", &v[i]);

    for(int i=n; i>=1; i--) {
        int rnk = findrank(1, n, v[i]);
        //printf("%d`s rank is %d\n", i, rnk);
        r[rnk] = i;
        update(rnk, 1);
    }

    for(int i=1; i<=n; i++)
        fprintf(fout, "%d\n", r[i]);


    fclose(fin);
    fclose(fout);
    return 0;
}