Cod sursa(job #2903350)

Utilizator razvan1234Danciu Razvan razvan1234 Data 17 mai 2022 15:08:47
Problema Order Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin ("order.in");
ofstream fout ("order.out");

int arb_int[400001];
void facere(int nod, int st, int dr)
{
    //if (nod < st or nod > dr) return;
    if (st == dr){
        arb_int[nod] = 1;
        return;
    }

    int mjl = (st + dr) / 2;
    facere(2*nod, st, mjl);
    facere(2*nod+1, mjl+1, dr);

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

int cauta(int nod, int st, int dr, int poz)
{
    if (st == dr) return st;

    int mjl = (st + dr) / 2;
    if (arb_int[2*nod] < poz) return cauta(2*nod+1, mjl+1, dr, poz-arb_int[2*nod]);
    else return cauta(2*nod, st, mjl, poz);
}

void change(int nod, int st, int dr, int val)
{
    if (st == dr){
        arb_int[nod] = 0;
        return;
    }

    int mjl = (st + dr) / 2;
    if (val <= mjl) change(2*nod, st, mjl, val);
    else change(2*nod+1, mjl+1, dr, val);

    arb_int[nod] = arb_int[2*nod] + arb_int[2*nod+1];
}
int main()
{
    int n;
    fin>>n;
    facere(1, 1, n);

    int poz = 2;
    for (int i = 1; i <= n; i++){
        poz += i - 1;
        poz %= arb_int[1];

        int copil = cauta(1, 1, n, poz);
        fout<<copil<<" ";
        change(1, 1, n, copil);
    }
    return 0;
}