Pagini recente » Cod sursa (job #2094992) | Cod sursa (job #1915514) | Cod sursa (job #386947) | Cod sursa (job #732064) | Cod sursa (job #3152192)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("order.in");
ofstream cout("order.out");
int n, bit[30002];
void update(int i, int val)
{
while(i <= n)
{
bit[i] += val;
i += i & -i;
}
}
int prefixSum(int i)
{
int sum = 0;
while(i > 0)
{
sum += bit[i];
i -= i & -i;
}
return sum;
}
int main()
{
int poz = 2;
cin >> n;
///bagam toate nr in aib ca exista cate o data fiecare
for(int i = 1; i <= n; i++)
update(i, 1);
for(int nr = 1; nr <= n; nr++)
{
int st = 0, dr = n; ///lb
poz = (poz + n - 1) % (n - nr + 1) + 1;
///deci stim pt fiecare suma cate nr mai avem in st
///si cautam nr care sa fie egal cu poz ca sa terminam
while(st < dr)
{
int mid = (st + dr) / 2;
if(prefixSum(mid) >= poz)
dr = mid;
else
st = mid + 1;
}
cout << dr << " ";
update(dr, - 1); ///scadem din ea ca s-a dus
}
return 0;
}