Cod sursa(job #1519646)

Utilizator dorin31Geman Dorin Andrei dorin31 Data 7 noiembrie 2015 17:38:11
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <sstream>
#define maxN 30001

using namespace std;

ifstream fin("order.in");
ofstream fout("order.out");
std::stringstream buffer;

int n, poz, val;
int arb[3*maxN];

void update(int nod, int st, int dr)
{
    if (st==dr)
    {
        arb[nod]+=val;
        return;
    }
    int mid=(st+dr)>>1;
    if (poz<=mid) update(2*nod,st,mid);
    else update(2*nod+1,mid+1,dr);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}

int query(int nod, int st, int dr)
{
    if (st==dr) return st;
    int mid=(st+dr)>>1;
    if (arb[nod*2]>=val) query(nod*2,st,mid);
    else {
        val-=arb[nod*2];
        return query(nod*2+1,mid+1,dr);
    }
}

int main()
{
    fin>>n;
    val=1;
    for (int i=1; i<=n; ++i)
    {
        poz=i;
        update(1,1,n);
    }

    int pas=1;
    for (int i=1; i<=n; ++i)
    {
        pas=(pas+i)%arb[1];
        if (!pas) pas=arb[1];
        val=pas;
        poz=query(1,1,n);
        buffer<<poz<<' ';
        val=-1;
        update(1,1,n);
        pas--;
        if (!pas) pas=arb[1];
    }
    fout<<buffer.str();
    return 0;
}