Pagini recente » Diferente pentru problema/k1 intre reviziile 5 si 4 | Cod sursa (job #2592798) | Borderou de evaluare (job #1857808) | Rezultatele filtrării | Cod sursa (job #2137581)
#include <cstdio>
#include <algorithm>
using namespace std;
struct punct
{
int place, i;
}a[30002];
int n, i, ind, val, Arb[100002], x;
bool cmp (punct a, punct b)
{
return (a.place<b.place);
}
void update(int nod, int st, int dr)
{
if (st>dr) return;
if (st==dr && st==ind){
Arb[nod]=val;
a[st].place=val;
return;
}
else if (st==dr){
if (Arb[nod]>=val){
Arb[nod]++;
a[st].place=Arb[nod];
}
return;
}
int mij=(st+dr)/2;
if (Arb[2*nod]>=val || ind<=mij) update(2*nod, st, mij);
if (Arb[2*nod+1]>=val || ind>mij) update(2*nod+1, mij+1, dr);
Arb[nod]=max(Arb[2*nod], Arb[2*nod+1]);
}
int main ()
{
freopen("schi.in", "r", stdin);
freopen("schi.out", "w", stdout);
scanf("%d", &n);
for (i=1; i<=n; i++){
scanf("%d", &x);
ind=i; val=x;
a[i].i=i;
update(1, 1, n);
}
sort(a+1, a+n+1, cmp);
for (i=1; i<=n; i++) printf("%d\n", a[i].i);
return 0;
}