Cod sursa(job #2466880)

Utilizator deiubejanAndrei Bejan deiubejan Data 3 octombrie 2019 09:54:43
Problema Order Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;


ifstream fin("test.in");
ofstream fout("test.out");


/*
#define cin fin
#define cout fout
*/

const int MAXN=4e4;
int arbore[MAXN*4];
int intLeft, intRight, val, pos, el;
int last, len, n;

void build(int left, int right, int nod)
{
    arbore[nod]=1;
    if(left==right)
        return;
    int mij=(left+right)/2;
    build(left, mij, nod*2);
    build(mij+1, right, nod*2+1);
}

void query(int left, int right, int nod)
{
    if(intLeft<=left&&right<=intRight)
    {
        val+=arbore[left];
        return;
    }
    int mij=(left+right)/2;
    if(intLeft<=mij)
        query(left, mij, 2*nod);
    if(mij<intRight)
        query(mij+1, right, 2*nod+1);
}

void update(int left, int right, int nod)
{
    arbore[nod]--;
    if(left==right)
    {
        el=left;
        return;
    }
    int mij=(left+right)/2;
    if(pos<=mij)
        update(left, mij, 2*nod);
    else
        update(mij+1, right, 2*nod+1);
}

void print(int v[])
{
    for(int i=1; i<=2*n; i++)
        cout<<v[i]<<" ";
}


int main()
{
    cin>>n;
    build(1,n,1);
   // print(arbore);
    last=0;
    for(int i=1; i<=n; i++)
    {
        val=0;
        len=i;
        intLeft=el+1;
        intRight=n;
        query(1,n,1);
        if(val<len)
        {
            len-=val;
            len%=n;
            if(len==0)
                len=n;
        }
        pos=len;
        update(1,n,1);
        cout<<el<<" ";
    }



    return 0;
}