Cod sursa(job #1183020)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 8 mai 2014 13:01:04
Problema Order Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 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<=x;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);
    for(i=1;i<=n;i++) v.push_back(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]=v[mn-1];
        U(mn, -1);
        v.erase(v.begin()+mn-1);

        z+=i;
        if(md) z=mod(z, md);
    }
    for(i=1;i<=n;i++)
        printf("%d ", a[i]);
    return 0;
    /*scanf("%d", &n);
    for(i=1;i<=n;i++) v.push_back(i);
    x=2;
    for(i=1;i<=n;i++)
    {
        x=x+i-1;
        x%=(n-i+1);
        if(x==0) x=n-i+1;
        y=v[x-1];
        a[i]=y;
        v.erase(v.begin()+x-1);
    }
    for(i=1;i<=n;i++)
        printf("%d ", a[i]);
    return 0;*/
}