Cod sursa(job #1606543)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 20 februarie 2016 12:44:22
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("order.in");
ofstream fout("order.out");
int n,aib[30005];

inline void Update(int p, int x)
{
    while(p <= n)
    {
        aib[p]+=x;
        p +=(p&(-p));
    }
}
inline int Query(int p)
{
    int s = 0;
    while(p > 0)
    {
        s+=aib[p];
        p -= (p&(-p));
    }
    return s;
}
inline int Bsearch(int x, int st, int dr)
{
    int mid,v,sol = -1,Q;
    Q = Query(st-1);
    while(st <= dr)
    {
        mid = (st+dr)/2;
        v = Query(mid)-Q;
        if(v == x)
        {
            sol = mid;
            dr = mid-1;
        }
        else if(v > x) dr = mid-1;
        else st = mid+1;
    }
    return sol;
}


void Solve()
{
    int i,poz,pas,k,x,nrz,sol,aux,Q;
    fin>>n;
    for(i = 1; i <= n; i++) Update(i,1);
    poz = 1;
    for(pas = 1; pas <= n; pas++)
    {
        sol = Query(n)-Query(poz);
        if(sol>=pas)
        {
            x = Bsearch(pas,poz+1,n);
            fout<<x<<" ";
            poz = x;
            Update(x,-1);
        }
        else
        {
            aux = pas;
            aux-=sol;
            k = aux%(n-pas+1);
            if(!k) k = n-pas+1;
            x = Bsearch(k,1,n);
            fout<<x<<" ";
            poz = x;
            Update(x,-1);
        }
    }
}

int main()
{
    Solve();
    fout.close();
    return 0;
}