Cod sursa(job #3358918)

Utilizator ecaterinaEcaterina Stefanescu ecaterina Data 22 iunie 2026 00:03:29
Problema Order Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

#define NMAX 100001
#define VALMAX 100001

int aint[4*VALMAX];

static inline int f(int x, int y) {
    return x+y;
}

void build(int nod, int st, int dr) {
    if (st==dr) {
        aint[nod] = 1;
        return;
    }

    int mijl, sonst, sondr;

    mijl = (st+dr)/2;
    sonst = nod+1;
    sondr = nod + 2*(mijl-st+1);

    build(sonst, st, mijl);
    build(sondr, mijl+1, dr);

    aint[nod] = f(aint[sonst], aint[sondr]);

    return;
}

void update(int nod, int st, int dr, int poz) {
    if (st==dr) {
        aint[nod]--;
        return;
    }

    int mijl, sonst, sondr;

    mijl = (st+dr)/2;
    sonst = nod+1;
    sondr = nod + 2*(mijl-st+1);

    if (poz<=mijl) {
        update(sonst, st, mijl, poz);
    } else {
        update(sondr, mijl+1, dr, poz);
    }

    aint[nod] = f(aint[sonst], aint[sondr]);

    return;
}

int query(int nod, int st, int dr, int pas) {
    if (st==dr) {
        return st;
    }

    int mijl, sonst, sondr;

    mijl = (st+dr)/2;
    sonst = nod+1;
    sondr = nod + 2*(mijl-st+1);

    if (pas <= aint[sonst]) {
        return query(sonst, st, mijl, pas);
    }
    return query(sondr, mijl+1, dr, pas-aint[sonst]);
}


int main() {
    ifstream fin("order.in");
    ofstream fout("order.out");

    int n, i, idx, poz;

    fin >> n;

    build(0, 1, n);

    poz = 1;
    for (i=1; i<=n; i++) {
        poz = (poz+i-1)%(n-i+1);
        idx = query(0, 1, n, poz+1);
        update(0, 1, n, idx);
        fout << idx << ' ';
    }

    fin.close();
    fout.close();
    return 0;
}