Cod sursa(job #1606761)

Utilizator dnprxDan Pracsiu dnprx Data 20 februarie 2016 15:14:36
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>
#define nmax 30005

using namespace std;

int n, aib[nmax];

inline void Update(int p, int x)
{
    while(p <= n)
    {
        aib[p] += x;
        p += (p & (-p));
    }
}

inline int Query(int p)
{
    int val = 0;
    while(p > 0)
    {
        val += aib[p];
        p -= (p & (-p));
    }
    return val;
}

inline int Bin_Search(int x,int st,int dr)
{
    int sol = 1, inter, mij, q;
    q = Query(st - 1);
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        inter = Query(mij) - q;
        if(inter == x)
        {
            sol = mij;
            dr = mij - 1;
        }
        else if(inter > x) dr = mij - 1;
        else st = mij + 1;
    }
    return sol;
}

int main()
{
    int i, sol, aux, k;
    int poz = 1, t;
    ifstream fin("order.in");
    ofstream fout("order.out");
    fin >> n;
    for(i = 1; i <= n; i++)
        Update(i, 1);
    for(i = 1; i <= n; i++)
    {
        sol = Query(n) - Query(poz);
        if(sol >= i)
        {
            t = Bin_Search(i, poz+1, n);
            fout << t << " ";
            poz = t;
            Update(poz, -1);
        }
        else
        {
            aux = i - sol;
            k = aux % (n - i + 1);
            if(k == 0) k = n - i + 1;
            aux = Bin_Search(k, 1, n);
            fout << aux << " ";
            poz = aux;
            Update(poz, -1);
        }
    }
    fin.close();
    fout.close();
    return 0;
}