Pagini recente » Cod sursa (job #1884039) | Cod sursa (job #1752298) | Cod sursa (job #1679117) | Cod sursa (job #1219147) | Cod sursa (job #2394339)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("order.in");
ofstream g("order.out");
int n, ramasi[305], poz_acutala=1, distanta=1, teoretic, auxn;
void adaugare(int ind, int val)
{
while (ind<=n) {
ramasi[ind] += val;
ind = ind + (ind & (-ind));
}
}
int cautare(int ind){
int s=0;
while (ind)
{
s+=ramasi[ind];
ind=ind-(ind&(-ind));
}
return s;
}
int cautare_ramasi(int val)
{
int st=1, dr=n;
while (st<dr)
{
int mij=(st+dr)/2;
int v=cautare(mij);
if (val<=v)
{
dr=mij;
} else
st=mij+1;
}
return st;
}
void stergere(int ind)
{
while (ind)
{
ramasi[ind]--;
ind=ind-(ind&(-ind));
}
}
int main() {
f >> n;
for (int i=1; i<=n; ++i)
{
adaugare(i,1);
}
auxn=n;
for (int i=1; i<=n; ++i)
{
teoretic=cautare(poz_acutala)+i;
teoretic%=auxn;
if (!teoretic)
teoretic=auxn;
int val=cautare_ramasi(teoretic);
adaugare(val,-1);
g << val << ' ';
poz_acutala=val;
auxn--;
}
return 0;
}