Pagini recente » Cod sursa (job #844492) | Cod sursa (job #2326264) | Cod sursa (job #1900039) | Cod sursa (job #2406700) | Cod sursa (job #648612)
Cod sursa(job #648612)
#include<fstream>
#define inf "schi.in"
#define outf "schi.out"
#define NMax 30010
#define Dim 65536
using namespace std;
fstream f(inf, ios::in), g(outf, ios::out);
int N, v[NMax], sol[NMax];
int A[4*NMax], m, pos;
void buildTree(int n, int left, int right) {
if( left==right ) {
A[n] = 1;
return;
}
m = (left+right)/2;
buildTree(2*n, left, m);
buildTree(2*n+1, m+1, right);
A[n] = A[2*n] + A[2*n+1];
}
void query(int n, int left, int right, int p) { // => pos
if( left==right ) {
pos = left;
return;
}
m = (left+right)/2;
if( p<=A[2*n] ) query(2*n, left, m, p);
else query(2*n+1, m+1, right, p-A[2*n]);
}
void update(int n, int left, int right) {
if( left==right ) {
A[n] = 0;
return;
}
m = (left+right)/2;
if( pos<=m ) update(2*n, left, m);
else update(2*n+1, m+1, right);
A[n] = A[2*n] + A[2*n+1];
}
int main()
{
f>>N;
for(int i=1; i<=N; i++) f>>v[i];
buildTree(1, 1, N);
for(int i = N; i>=1; i--) {
query(1, 1, N, v[i]);
sol[pos] = i;
update(1, 1, N);
}
for(int i=1; i<=N; i++) {
g<< sol[i] <<"\n";
}
f.close(); g.close();
return 0;
}