Pagini recente » Cod sursa (job #1621043) | Cod sursa (job #598978) | Cod sursa (job #655849) | Simulare 49 | Cod sursa (job #1826352)
//Schi
#include <fstream>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
#define DMAX 30001
int ArbInt[2*DMAX];
int poz[DMAX];
void construiesteArbInt(int nod, int st, int dr) {//cu sume
if(st == dr) {
ArbInt[nod] = 1;
return;
}
int mid = (st + dr)/2;
construiesteArbInt(2*nod, st, mid);
construiesteArbInt(2*nod + 1, mid + 1, dr);
ArbInt[nod] = ArbInt[2*nod] + ArbInt[2*nod + 1];
return;
}
void update(int nod, int change, int st, int dr) {
if(st == dr) {
ArbInt[nod] = 0;
return;
}
int mid = (st + dr)/2;
if(change <= mid) update(2*nod, change, st, mid);
else update(2*nod + 1, change, mid + 1, dr);
ArbInt[nod] -= 1;
}
int query(int nod, int val, int st, int dr) {
if(st == dr)
return st;
else {
int mid = (st + dr)/2;
if(val > ArbInt[2*nod])
query(2*nod + 1, val - ArbInt[2*nod], mid + 1, dr);
else
query(2*nod, val, st, mid);
}
}
int main()
{
int N, i;
int v[DMAX];
fin>>N;
for(i = 1 ; i <= N ; i++) {
fin>>v[i];
poz[i] = 1;
}
construiesteArbInt(1, 1, N);
poz[v[N]] = N;
update(1, v[N], 1, N);
for(i = N - 1 ; i >= 1 ; i--) {
int schimba = query(1, v[i], 1, N);
poz[schimba] = i;
update(1, schimba, 1, N);
}
for(i = 1 ; i <= N ; i++)
fout<<poz[i]<<' ';
fin.close();
fout.close();
return 0;
}