Pagini recente » Cod sursa (job #92336) | Cod sursa (job #25546) | Cod sursa (job #1712148) | Rating Razvan Uzum (razvi99) | Cod sursa (job #3133546)
#include <fstream>
using namespace std;
ifstream in("ski.in");
ofstream out("ski.out");
const int NMAX = 30000;
int v[1 + NMAX];
int aint[1 + 4 * NMAX];
int sol[1 + NMAX];
int queryfunc(int index, int st, int dr, int poz) {
if (st == dr)
return st;
int mij = (st + dr) / 2;
int fiuSt = 2 * index;
int fiuDr = 2 * index + 1;
if (poz <= aint[fiuSt])
return queryfunc(fiuSt, st, mij, poz);
else
return queryfunc(fiuDr, mij + 1, dr, poz - aint[fiuSt]);
}
void func2(int index, int st, int dr, int poz) {
if (st == dr) {
aint[index] = 0;
return;
}
int mij = (st + dr) / 2;
int fiuSt = 2 * index;
int fiuDr = 2 * index + 1;
if (poz <= mij)
func2(fiuSt, st, mij, poz);
else
func2(fiuDr, mij + 1, dr, poz);
aint[index] = aint[fiuSt] + aint[fiuDr];
}
void func(int index, int st, int dr) {
if (st == dr) {
aint[index] = 1;
return;
}
int mij = (st + dr) / 2;
int fiuSt = 2 * index;
int fiuDr = 2 * index + 1;
func(fiuSt, st, mij);
func(fiuDr, mij + 1, dr);
aint[index] = aint[fiuSt] + aint[fiuDr];
}
int main() {
int n;
in >> n;
for (int i = 1; i <= n; i++)
in >> v[i];
func(1, 1, n);
for (int i = n; i >= 1; i--) {
int poz = queryfunc(1, 1, n, v[i]);
sol[poz] = i;
func2(1, 1, n, poz);
}
for (int i = 1; i <= n; i++)
out << sol[i] << '\n';
in.close();
out.close();
return 0;
}