Pagini recente » Cod sursa (job #548809) | Clasamentul arhivei Infoarena Monthly | Cod sursa (job #1733834) | Cod sursa (job #2449654) | Cod sursa (job #3241859)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
#define lsb(i) (i & (-i))
const int NMAX = 30001;
int v[NMAX], aib[NMAX], locuri[NMAX], n;
void update(int val, int poz)
{
for(int i = poz; i <= n; i += lsb(i))
aib[i] += val;
}
int sum(int poz)
{
int s = 0;
for(int i = poz; i >= 1; i -= lsb(i))
s += aib[i];
return s;
}
int find_poz(int ranking)
{
int st = 1, dr = n, poz = n + 1;
while(st <= dr)
{
int mid = (st + dr) / 2;
if(sum(mid) < ranking)
st = mid + 1;
else
{
poz = mid;
dr = mid - 1;
}
}
update(-1, poz);
return poz;
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
{
fin >> v[i];
update(1, i);
}
for (int i = n; i >= 1; i--)
locuri[find_poz(v[i])] = i;
for (int i = 1; i <= n; i++)
fout << locuri[i] << "\n";
return 0;
}