Cod sursa(job #1183033)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 8 mai 2014 13:16:08
Problema Order Scor 100
Compilator cpp Status done
Runda aib-uri Marime 1.07 kb
#include <cstdio>
#include <vector>
#define lsb(x) (x&(-x))

using namespace std;
int n, i, p, u, k, md, z, mn, x, aib[30005], a[30005];
void U(int p, int x)
{
    int i;
    for(i=p;i<=n;i+=lsb(i))
        aib[i]+=x;
}
int Q(int x)
{
    int i, s=0;
    for(i=x;i>=1;i-=lsb(i))
        s+=aib[i];
    return s;
}
int mod(int x, int y)
{
    if(!(x%y)) return y;
    return x%y;
}
vector <int> v;
int main()
{
    freopen("order.in", "r", stdin);
    freopen("order.out", "w", stdout);
    scanf("%d", &n);
    for(i=1;i<=n;i++) aib[i]=lsb(i);
    z=2;
    md=n;
    for(i=1;i<=n;i++)
    {
        --md;
        p=1;u=n;
        mn=9999999;
        while(p<=u)
        {
            k=p+(u-p)/2;
            x=Q(k);
            if(x==z&&k<mn)
            {
                mn=k;
                u=k-1;
            }
            else if(x>z) u=k-1;
            else p=k+1;
        }
        a[i]=mn;
        U(mn, -1);

        z+=i;
        if(md) z=mod(z, md);
    }
    for(i=1;i<=n;i++)
        printf("%d ", a[i]);
    return 0;
}