Pagini recente » Cod sursa (job #1597291) | Cod sursa (job #1669162) | Cod sursa (job #1012107) | Cod sursa (job #1837562) | Cod sursa (job #2791376)
#include <climits>
#include <cstdio>
#define MAXN 30002
using namespace std;
struct schi
{
int pos;
int val;
int lazy;
};
schi T[4*MAXN];
int v[MAXN], N;
int pos, val;
void build(int node, int st, int dr)
{
if(st == dr)
{
T[node].pos = st;
T[node].val = v[st];
T[node].lazy = 0;
}
else
{
int mid = (st + dr) / 2;
build(2 * node, st, mid);
build(2 * node + 1, mid + 1, dr);
T[node] = T[2 * node + 1];
if (T[node].val > T[2 * node].val)
{
T[node] = T[2 * node];
}
}
}
void propagate(int node, int st, int dr)
{
if(st != dr)
{
T[2 * node].lazy += T[node].lazy;
T[2 * node + 1].lazy += T[node].lazy;
}
T[node].val -= T[node].lazy;
T[node].lazy = 0;
}
void update(int node, int st, int dr)
{
propagate(node, st, dr);
if(st == dr)
{
T[node].val = INT_MAX;
}
else
{
int mid = (st + dr) / 2;
if(pos <= mid)
{
update(2 * node, st, mid);
T[2 * node + 1].lazy++;
propagate(2 * node + 1, mid + 1, dr);
}
else
{
update(2 * node + 1, mid + 1, dr);
propagate(2 * node, st, mid);
}
T[node] = T[2 * node + 1];
if (T[node].val > T[2 * node].val)
{
T[node] = T[2 * node];
}
}
}
int main()
{
freopen("schi.in", "r", stdin);
freopen("schi.out", "w", stdout);
scanf("%d",&N);
for(int i = 1; i <= N; i++)
{
scanf("%d",&v[i]);
}
build(1, 1, N);
for(int i = 1; i <= N; i++)
{
printf("%d\n", T[1].pos);
pos = T[1].pos;
update(1, 1, N);
}
return 0;
}