Cod sursa(job #1797273)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 4 noiembrie 2016 10:30:12
Problema Order Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <stdlib.h>
int v[70001];
void form(int st,int dr,int pos)
{
    if(st!=dr)
    {
        form(st,(st+dr)/2,pos*2);
        form((st+dr)/2+1,dr,pos*2+1);
    }
    v[pos]=(dr-st)+1;
}
int verif(int st,int dr,int pos,int a,int b)
{
    int s=0;
    if(dr<a || b<st)
        return 0;
    else
    {
        if(a<=st && b>=dr)
            return v[pos];
        else{
            if(a<=(st+dr)/2)
                s+=verif(st,(st+dr)/2,pos*2,a,b);
            if(b>=(st+dr)/2+1)
                s+=verif((st+dr)/2+1,dr,pos*2+1,a,b);
            return s;
        }
    }
}
int search(int st,int dr,int pos,int x)
{
    int i;
    if(st==dr)
        return st;
    else
    {
        if(v[pos*2]<x)
            return search((st+dr)/2+1,dr,pos*2+1,x-v[pos*2]);
        else
            return search(st,(st+dr)/2,pos*2,x);
    }
}
void update(int st,int dr,int pos,int x)
{
    if(st!=dr)
    {
        if(x<=(st+dr)/2)
            update(st,(st+dr)/2,pos*2,x);
        else
            update((st+dr)/2+1,dr,pos*2+1,x);
    }
    v[pos]--;
}
int main()
{
    int i,n,el,k,z,x;
    freopen("order.in","r",stdin);
    freopen("order.out","w",stdout);
    scanf("%d",&n);
    form(1,n,1);
    el=1;
    for(i=1; i<=n; i++)
    {
        k=verif(1,n,1,el+1,n);
        if(k>=(i-1)%v[1]+1)
        {
            z=verif(1,n,1,1,el);
            k=(i-1)%v[1]+1;
            k+=z;
            x=search(1,n,1,k);
        }
        else
        {
            z=(i-1)%v[1]+1;
            z-=k;
            x=search(1,n,1,z);
        }
        printf("%d\n",x);
        update(1,n,1,x);
        el=x;
    }

    return 0;
}