Cod sursa(job #1556423)

Utilizator antanaAntonia Boca antana Data 24 decembrie 2015 20:06:20
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#define zeros(x) ((x^(x-1))&x)
#define MAX 30000
using namespace std;
int aib[2*MAX+1], n, vc[MAX+1];
void update(int poz, int val)
{
    int i;
    for(i=poz;i<=n;i+=zeros(i))
        aib[i]+=val;
}
int query(int poz)
{
    int sum=0, i;
    for(i=poz;i>=1;i-=zeros(i))
        sum+=aib[i];
    return sum;
}
int elem(int nrel)
{
    int x, l1, l2, mij, p;
    l1=1;
    l2=n;
    while(l1<=l2)
    {
        mij=(l1+l2)/2;
        x=query(mij);
        if(x==nrel&&vc[mij]!=-1)
            p=mij;
        if(x>=nrel)
            l2=mij-1;
        if(x<nrel)
            l1=mij+1;
    }
    return p;
}
int main()
{
    freopen("order.in", "r", stdin);
    freopen("order.out", "w", stdout);
    int i, e, poz;
    scanf("%d", &n);
    for(i=1;i<=n;i++)
        update(i, 1);
    poz=2;
    int ram=n;
    for(i=1;i<=n;i++)
    {
        e=elem(poz);
        printf("%d ", e);
        vc[e]=-1;
        ram--;
        update(e, -1);
        poz+=i;
        if(ram!=0)
            poz%=ram;
        if(ram==1)
            poz=1;
        if(poz==0)
            poz=ram;
    }
    return 0;
}