Pagini recente » Borderou de evaluare (job #2805200) | Borderou de evaluare (job #1682076) | Borderou de evaluare (job #3119400) | Cod sursa (job #3165674) | Cod sursa (job #1556423)
#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;
}