Pagini recente » Cod sursa (job #1632837) | Cod sursa (job #470071) | Cod sursa (job #1947628) | Cod sursa (job #1583796) | Cod sursa (job #2489374)
#include <fstream>
using namespace std;
ifstream fin("order.in");
ofstream fout("order.out");
int n, aib[30005];
void Update(int poz, int x)
{
while(poz <= n)
{
aib[poz] += x;
poz += poz & (-poz);
}
}
int Suma(int poz)
{
int s = 0;
while(poz > 0)
{
s += aib[poz];
poz -= poz & (-poz);
}
return s;
}
int PrimPoz(int x)
{
int poz = 0, pas = (1 << 15);
while(pas > 0)
{
if(poz + pas <= n && aib[poz + pas] < x)
{
poz += pas;
x -= aib[poz];
}
pas /= 2;
}
poz++;
return poz;
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
Update(i, 1);
int x = 1;
for(int j = 1; j <= n; j++)
{
int i = j % (n - j + 1);
if (i == 0) i = n - j + 1;
int pozn, pozx;
pozn = Suma(n);
pozx = Suma(x);
if(pozn - pozx >= i) x = PrimPoz(pozx + i);
else x = PrimPoz(pozx - pozn + i);
fout << x << " ";
Update(x, -1);
}
return 0;
}