Pagini recente » Cod sursa (job #3363045) | Borderou de evaluare (job #3362635) | Cod sursa (job #3362555) | Borderou de evaluare (job #3362642) | Cod sursa (job #3363005)
#include <bits/stdc++.h>
using namespace std;
const int N = 30000;
int a[2 * N + 1], v[N], sol[N + 1];
void update(int node, int le, int ri, int val, int poz)
{
if (le == ri)
{
a[node] = val;
return;
}
int mij = (le + ri) / 2;
if (poz <= mij)
{
update(2 * node, le, mij, val, poz);
}
else
{
update(2 * node + 1, mij + 1, ri, val, poz);
}
a[node] = a[2 * node] + a[2 * node + 1];
}
int query(int node, int le, int ri, int val)
{
if (le == ri)
{
if (val == 0)
return le - 1;
return le;
}
int mij = (le + ri) / 2;
if (a[2 * node] < val)
{
return query(2 * node + 1, mij + 1, ri, val - a[2 * node]);
}
else
{
return query(2 * node, le, mij, val);
}
}
int main()
{
ifstream cin("schi.in");
ofstream cout("schi.out");
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int i, n, x;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> v[n - i - 1];
update(1, 1, n, 1, i + 1);
}
for (i = 0; i < n; i++)
{
// sol[i] = query(v[i]) poz libere;
x = query(1, 1, n, v[i]);
sol[x] = n - i;
update(1, 1, n, 0, x);
}
for (i = 1; i <= n; i++)
{
cout << sol[i] << "\n";
}
return 0;
}