Cod sursa(job #1807216)

Utilizator OlivianOlivian Dan Cretu Olivian Data 16 noiembrie 2016 10:35:26
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
using namespace std;
int aib[30007],n,logn;
void aib_update(int i,int s)
{
    for(;i<=n;i+=i&(-i)) aib[i]+=s;
}

int aib_query(int i)
{
    int s=0;
    for(;i>=1;i-=i&(-i)) s+=aib[i];
    return s;
}
int caut_bin(int s)
{
    int poz=0;
    for(int i=logn;i>=0;i--)
        if((poz+(1<<i))<=n && aib[poz+(1<<i)]<s)
        {
            poz+=1<<i;
            s-=aib[poz];
        }
    return poz+1;
}
int main()
{
    freopen("order.in","r",stdin);
    freopen("order.out","w",stdout);
    int k=2,r;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) aib_update(i,1);
    for(logn=1;(1<<logn)<=n;logn++);
    logn--;
    for(int j=2;j<=n;j++)
    {
        r=caut_bin(k);
        aib_update(r,-1);
        printf("%d ",r);
        k=(k-1+j)%(n-j+1);
        if(k==0) k=n-j+1;
    }
    r=caut_bin(k);
    printf("%d ",r);
    return 0;
}