#include <iostream>
#include <fstream>
using namespace std;
ifstream f("schi.in");
ofstream g("schi.out");
const int NMAX = 30001;
int v[NMAX * 4], poz[NMAX], sol[NMAX];
int query(int node, int from, int to, int val)
{
int sum = 0;
if(from == to)
return to;
int mij = (from + to) / 2;
if(v[node * 2] >= val)
{
int cat = query(node * 2, from, mij, val);
sum += cat;
}
if(v[node * 2] < val)
{
int cat = query(node * 2 + 1, mij + 1, to, val - v[node * 2]);
sum += cat;
}
return sum;
}
void update(int node, int from, int to, int pos, int val)
{
if(from == to)
{
v[node] += val;
return;
}
int mij = (from + to) / 2;
if(pos <= mij)
update(node * 2, from, mij, pos, val);
else
update(node * 2 + 1, mij + 1, to, pos, val);
v[node] = v[node * 2] + v[node * 2 + 1];
}
int main()
{
int n;
f >> n;
for(int i = 1; i <= n; i++)
{
f >> poz[i];
update(1, 1, n, i, 1);
}
for(int i = n; i >= 1; i--)
{
int p = query(1, 1, n, poz[i]);
update(1, 1, n, p, -1);
sol[p] = i;
}
for(int i = 1; i <= n; i++)
g << sol[i] << '\n';
return 0;
}#include <iostream>
#include <fstream>
using namespace std;
ifstream f("schi.in");
ofstream g("schi.out");
const int NMAX = 30001;
int v[NMAX * 4], poz[NMAX], sol[NMAX];
int query(int node, int from, int to, int val)
{
int sum = 0;
if(from == to)
return to;
int mij = (from + to) / 2;
if(v[node * 2] >= val)
{
int cat = query(node * 2, from, mij, val);
sum += cat;
}
if(v[node * 2] < val)
{
int cat = query(node * 2 + 1, mij + 1, to, val - v[node * 2]);
sum += cat;
}
return sum;
}
void update(int node, int from, int to, int pos, int val)
{
if(from == to)
{
v[node] += val;
return;
}
int mij = (from + to) / 2;
if(pos <= mij)
update(node * 2, from, mij, pos, val);
else
update(node * 2 + 1, mij + 1, to, pos, val);
v[node] = v[node * 2] + v[node * 2 + 1];
}
int main()
{
int n;
f >> n;
for(int i = 1; i <= n; i++)
{
f >> poz[i];
update(1, 1, n, i, 1);
}
for(int i = n; i >= 1; i--)
{
int p = query(1, 1, n, poz[i]);
update(1, 1, n, p, -1);
sol[p] = i;
}
for(int i = 1; i <= n; i++)
g << sol[i] << '\n';
return 0;
}