Pagini recente » Cod sursa (job #1881971) | Cod sursa (job #2987522) | Cod sursa (job #3273738) | Cei mai harnici utilizatori info-arena | Cod sursa (job #2642677)
#include <cstdio>
using namespace std;
const int NMAX = 30000;
int aint[4 * NMAX + 5];
void build(int st , int dr , int nod)
{
if(st == dr)
aint[nod] = 1;
else
{
int med = (st + dr) / 2;
build(st , med , nod << 1);
build(med + 1 , dr , (nod << 1)|1);
aint[nod] = aint[nod << 1] + aint[(nod << 1)|1];
}
}
int ql , qr , sum , val , sol;
void query(int st , int dr , int nod)
{
int med = (st + dr) / 2;
if(ql <= st && dr <= qr && sum < val)
{
if(sum + aint[nod] < val)
{
sum += aint[nod];
return;
}
else
{
if(st == dr)
{
sum += aint[nod];
aint[nod] = 0;
sol = st;
return;
}
if(sum + aint[nod << 1] >= val)
query(st , med , nod << 1);
else
{
sum += aint[nod << 1];
query(med + 1, dr , (nod << 1)|1);
}
}
}
else
{
if(ql <= med && sum < val)
query(st , med , nod << 1);
if(qr > med && sum < val)
query(med + 1 , dr , (nod << 1)|1);
}
aint[nod] = aint[nod << 1] + aint[(nod << 1)|1];
}
int main()
{
freopen("order.in" , "r" , stdin);
freopen("order.out" , "w" , stdout);
int n , i , last , current;
scanf("%d" , &n);
build(1 , n , 1);
last = 1;
for(i = 1 ; i <= n ; i ++)
{
sol = -1;
val = i;
sum = 0;
ql = last + 1;
if(ql == n + 1)
ql = 1;
qr = n;
query(1 , n , 1);
if(sol == -1)
{
val = (val - sum) % aint[1];
if(val == 0)
val = aint[1];
sum = 0;
ql = 1;
qr = n;
query(1 , n , 1);
}
printf("%d " , sol);
last = sol;
}
return 0;
}