Pagini recente » Cod sursa (job #2464882) | Cod sursa (job #1538811) | Cod sursa (job #890350) | Cod sursa (job #642595) | Cod sursa (job #2777969)
#include <fstream>
using namespace std;
template <class TData, class TOver>
class FenwickTree{
public:
TData* data;
int len;
TOver Query(int i)
{
TOver sum = 0;
while(i > 0)
{
sum += data[i];
i -= (i & (-i));
}
return sum;
}
void UpdateOneBased(int i, TData delta)
{
Update(i-1, delta);
}
void Update(int i, TData delta)
{
++i;
while(i < len)
{
data[i] += delta;
i += (i & (-i));
}
}
FenwickTree(int capacity)
{
len = capacity + 1;
data = (TData*) calloc(len, sizeof(TData));
}
};
int binary(int target, int n, FenwickTree<int,int> bit)
{
int st, dr, mid;
st = 1;
dr = n;
while(st < dr)
{
mid = (st + dr) / 2;
if(bit.Query(mid) == target)
dr = mid;
else if(bit.Query(mid) > target)
dr = mid - 1;
else
st = mid + 1;
}
return st;
}
const int MAXN = 30005;
int ans[MAXN], arr[MAXN];
int main()
{
ifstream cin ("schi.in");
ofstream cout ("schi.out");
int n;
cin >> n;
FenwickTree<int,int> aib = *(new FenwickTree<int,int>(MAXN));
for(int i = 1; i <= n; i++)
{
cin >> arr[i];
aib.UpdateOneBased(i, 1);
}
for(int i = n; i > 0; i--)
{
//for(int j = 1; j < n; j++)
// cout << aib.Query(j) << " ";
//cout << endl;
int bs = binary(arr[i], n, aib);
ans[bs] = i;
aib.UpdateOneBased(bs, -1);
}
for(int i = 1; i <= n; i++)
cout << ans[i] << "\n";
return 0;
}