Pagini recente » Cod sursa (job #3184295) | Cod sursa (job #2968113) | Cod sursa (job #3124466) | Cod sursa (job #1649131) | Cod sursa (job #1777031)
#include <stdio.h>
#include <stdlib.h>
#define zero(x) (x&(-x))
int aib[30001], sol[30001];
inline void update(int poz, int val, int n){
for(poz; poz<=n; poz+=zero(poz))
aib[poz]+=val;
}
inline int suma(int poz){
int sum=0;
for(poz; poz>0; poz-=zero(poz))
sum+=aib[poz];
return sum;
}
inline int cautBin(int val, int n){
int b=1, e=n, m, x, min=2000000000;
while(b<=e){
m=(b+e)/2;
x=suma(m);
if(x==val && m<min)
min=m;
else if(x<val)
b=m+1;
else
e=m-1;
}
return min;
}
int main()
{
FILE *fin, *fout;
int n, i, poz, nrcop, aux;
fin=fopen("order.in", "r");
fscanf(fin, "%d", &n);
fclose(fin);
for(i=1; i<=n; i++)
update(i, 1, n);
poz=2; nrcop=n;
for(i=1; i<=n; i++){
--nrcop;
aux=cautBin(poz, n);
update(aux, -1, n);
sol[i]=aux;
poz+=i;
if(nrcop)
poz=(poz-1)%nrcop+1;
}
fout=fopen("order.out", "w");
for(i=1; i<=n; i++)
fprintf(fout, "%d ", sol[i]);
fprintf(fout, "\n");
fclose(fout);
return 0;
}