Pagini recente » Cod sursa (job #2054879) | Photo | Cod sursa (job #928864) | Cod sursa (job #1901466) | Cod sursa (job #1291201)
#include<cstdio>
#include<ctime>
#include<cstdlib>
// aici aveti un 666
using namespace std;
struct t
{
short k, nr, p;
t *f1, *f2;
t()
{
k = 0;
p = 0;
nr = 0;
}
t(short a, short b, t *c, t *d)
{
k = a;
p = b;
f1 = c;
f2 = d;
nr = 1;
}
};
t *radarada, *nil;
int n;
void recalc(t* &r)
{
if(r != nil)
r->nr = 1 + r->f1->nr + r->f2->nr;
}
void Rrot(t* &r)
{
t *temp = r->f2;
r->f2 = temp->f1;
temp->f1 = r;
r = temp;
}
void Lrot(t* &r)
{
t *temp = r->f1;
r->f1 = temp->f2;
temp->f2 = r;
r = temp;
}
void balance(t* &r)
{
if(r->f2->p > r->p)
Rrot(r);
if(r->f1->p > r->p)
Lrot(r);
recalc(r->f1);
recalc(r->f2);
recalc(r);
}
void update(t* &r, short key, short val, short prior)
{
if(r == nil)
{
r = new t(key, prior, nil, nil);
return;
}
if(r->f1->nr < val)
update(r->f2, key, val - (r->f1->nr) - 1, prior);
else
update(r->f1, key, val, prior);
balance(r);
}
void afrect(t* &r)
{
if(r == nil)
return;
afrect(r->f1);
printf("%d\n", r->k);
afrect(r->f2);
}
int main()
{
freopen("schi.in", "r", stdin);
freopen("schi.out", "w", stdout);
int i, x;
scanf("%d", &n);
srand(666);
nil = new t;
radarada = new t;
nil->f1 = nil->f2 = nil;
scanf("%d", &x);
radarada->f1 = nil;
radarada->f2 = nil;
radarada->nr = 1;
radarada->k = 1;
radarada->p = rand() % 31666 + 1;
for(i = 2; i <= n; ++ i)
{
scanf("%d", &x);
update(radarada, i, x - 1, rand() % 31666 + 1);
}
afrect(radarada);
return 0;
}