Cod sursa(job #2622221)

Utilizator mehanixCiausu Nicoleta mehanix Data 31 mai 2020 18:26:52
Problema Order Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("order.in");
ofstream g("order.out");

int arbint[120005];
int answer;
void update(int nod, int st, int dr, int poz, int val)
{
    if (st == dr)
    {
        arbint[nod] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if (poz <= mid)
    {
        update(2 * nod, st, mid, poz, val);
    }
    else
    {
        update(2 * nod + 1, mid + 1, dr, poz, val);
    }
    //dupa ce s-a pus 1 unde trebuie, update tot ce e in sus
    arbint[nod] = arbint[2 * nod] + arbint[2 * nod + 1];
}
void query(int nod, int st_nod, int dr_nod, int st_query, int dr_query)
{
    if (st_query <= st_nod && dr_nod <= dr_query)
    {
        answer += arbint[nod];
        return;
    }
    int mid = (st_nod + dr_nod) / 2;
    if (st_query <= mid)
        query(2 * nod, st_nod, mid, st_query, dr_query);
    if (mid + 1 <= dr_query)
        query(2 * nod + 1, mid + 1, dr_nod, st_query, dr_query);
}
void find(int nod, int st, int dr, int val)
{
    if (st == dr)
    {
        answer = st;
        return;
    }
    int mid = (st + dr) / 2;
    // if stg < val go dr
    if (arbint[2 * nod] < val)
    {
        find(2 * nod + 1, mid + 1, dr, val - arbint[2 * nod]);
    }
    else
    {
        find(2 * nod, st, mid, val);
    }
}
int main()
{
    int n;
    f >> n;
    // arbint sume partiale
    for (int i = 1; i <= n; i++)
    {
        update(1, 1, n, i, 1);
    }
    int curent = 1;
    for (int i = 1; i <= n; i++)
    {
        answer = 0;
        query(1, 1, n, 1, curent);
        int add = answer;
        answer = 0;
        int pas;
        if ((i + add) % (n - i + 1) == 0)
        {
            pas = n - i + 1;
        }
        else
        {
            pas = (i + add) % (n - i + 1);
        }

        find(1, 1, n, pas);
        g << answer << ' ';
        update(1, 1, n, answer, 0);
        curent = answer;
    }
}