Pagini recente » Cod sursa (job #1156817) | Cod sursa (job #532806) | Cod sursa (job #814173) | Cod sursa (job #2405732) | Cod sursa (job #3303649)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("schi.in");
ofstream fout("schi.out");
int lsb(int x)
{
return x & (-x);
}
struct AIB
{
vector<int> aib;
AIB(int n)
{
aib.resize(n + 1);
}
long long int query(int x)
{
if(x >= aib.size()) return 0;
long long int sum = 0;
for(int i = x; i > 0; i -= lsb(i))
sum += aib[i];
return sum;
}
void update(int x, int add)
{
for(int i = x; i < aib.size(); i += lsb(i))
aib[i] += add;
}
int cibin(long long int s)
{
int ans = 0;
long long int sum_ans = 0;
for(int pas = (1 << 18); pas > 0; pas /= 2)
{
if(ans + pas >= aib.size()) continue;
if((sum_ans + aib[ans + pas] < s))
{
ans += pas;
sum_ans += aib[ans];
}
}
return ans + 1;
}
};
int arr[30009], rez[30009];
int main()
{
int n;
fin >> n;
AIB aib(n);
for(int i = 1; i <= n; i++)
{
fin >> arr[i];
aib.update(i, 1);
}
for(int i = n; i >= 1; i--)
{
rez[i] = aib.cibin(arr[i]);
aib.update(rez[i], -1);
}
int rez2[30009]{};
for(int i = 1; i <= n; i++)
{
rez2[rez[i]] = i;
}
for(int i = 1; i <= n; i++)
fout << rez2[i] << '\n';
return 0;
}