Pagini recente » Cod sursa (job #423870) | Cod sursa (job #345906) | Cod sursa (job #2045820) | Cod sursa (job #1220223) | Cod sursa (job #991129)
Cod sursa(job #991129)
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 30005
using namespace std;
int n, presumedPos, actualPos, l, s;
int H[2*nmax], v[nmax], sol[nmax];
void update(int node, int lo, int hi, int pos) {
if(lo == hi) {
H[node]++;
return;
}
int mid = (lo + hi) >> 1;
if(pos <= mid) update(2*node, lo, mid, pos);
else update(2*node+1, mid+1, hi, pos);
H[node] = H[2*node] + H[2*node+1];
}
void sum(int node, int lo, int hi, int a, int b) {
if(a <= lo && hi <= b) { s += H[node]; return; }
int mid = (lo + hi) >> 1, ret = 0;
if(a <= mid) sum(2*node, lo, mid, a, b);
if(b > mid) sum(2*node+1, mid+1, hi, a, b);
}
int main() {
ifstream f("schi.in");
ofstream g("schi.out");
f>>n;
for(int i=1; i<=n; i++) f>>v[i];
for(int i=n; i>=1; i--) {
presumedPos = v[i];
actualPos = presumedPos;
l = 0;
while(1) {
s = 0;
sum(1, 0, n, l, presumedPos);
if(s == 0) break;
actualPos += s;
l = presumedPos+1;
presumedPos = actualPos;
}
//cout<<i<<": in="<<v[i]<<"; actualPos="<<actualPos<<"; sum = "<<actualPos-presumedPos<<"\n";
sol[actualPos] = i;
update(1, 0, n, actualPos);
}
for(int i=1; i<=n; i++) g<<sol[i]<<"\n";
return 0;
}