Cod sursa(job #2904691)

Utilizator NefelibataAnton Marius Alexandru Nefelibata Data 18 mai 2022 00:37:58
Problema Order Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, p, v[400002];
void create (int node, int l, int r )
{
    if(l == r)
    {
        v[node] = 1;
        return;
    }
    else {
        int mid =(l+r) / 2;
        create (2*node, l, mid);
        create (2*node+1, mid + 1, r);
        v[node] = v[2*node] + v[2*node+1];
    }
}

int src(int node, int l, int r, int p)
{
    if(l == r) return l;
    int mid = (l+r)/2;
    if(v[2*node] < p) return src (2*node+1, mid + 1, r, p-v[2*node]);
    else return src (2*node, l, mid, p);
}

void edit (int node, int l, int r, int x)
{
    if (l == r)
    {
        v[node] = 0;
        return;
    }
    else {
        int mid = (l+r)/2;
        if (x <= mid) edit (2*node, l, mid, x);
        else edit (2*node+1, mid + 1, r, x);
        v[node] = v[2*node] + v[2*node+1];
    }
}

int main()
{
    p = 2;
    f>>n;
    create(1,1,n);
    for(int i = 1; i <= n; i++)
    {
        p += i;
        --p;
        int y = v[1];
        for (; p > y; p -= y) {}

        int x = src (1, 1, n, p);
        o<<x<<" ";
        edit (1, 1, n, x);
    }

    return 0;
}