Cod sursa(job #2926084)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 16 octombrie 2022 21:51:08
Problema Order Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

const int NMAX=4e5+5;
int aint[NMAX];

void build(int p,int st,int dr)
{
    int mij;
    if(st==dr)
    {
        aint[p]=1;
        return ;
    }
    else
    {
        mij=(st+dr)/2;
        build(2*p,st,mij);
        build(2*p+1,mij+1,dr);
        aint[p]=aint[2*p]+aint[2*p+1];
    }
}

void update(int p,int st,int dr,int x)
{
    int mij;
    if(st==dr)
    {
        aint[p]=0;
        return ;
    }
    else
    {
      mij=(st+dr)/2;
      if(x<=mij)
        update(2*p,st,mij,x);
      else
        update(2*p+1,mij+1,dr,x);
      aint[p]=aint[2*p]+aint[2*p+1];
    }
}

int query(int p,int st,int dr,int y)
{
    int mij;
    if(st==dr)
        return st;
    else
    {
        mij=(st+dr)/2;
        if(aint[2*p]>=y)
            return query(2*p,st,mij,y);
        else
            return query(2*p+1,mij+1,dr,y-aint[2*p]);
    }
}

int main()
{
    int n,i,j,l=1,q;
    fin>>n;
    build(1,1,n);
    for(i=1;i<=n;i++)
    {
        l=(l+i)%aint[1];
        if(l==0)
            l=aint[1];
        q=query(1,1,n,l);
        update(1,1,n,q);
        l--;
        fout<<q<<" ";
    }
    return 0;
}