Cod sursa(job #1747946)

Utilizator antracodRadu Teodor antracod Data 25 august 2016 20:27:23
Problema Order Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>

using namespace std;

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

const int NMAX=30005;
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);
    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;
    in >> 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);
            out << 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);
            out << aux << " ";

            poz = aux;
            Update(poz, -1);
        }
    }

    return 0;
}