Pagini recente » Cod sursa (job #2829331) | Cod sursa (job #2702684) | Cod sursa (job #2083940) | Cod sursa (job #904518) | Cod sursa (job #1714288)
#include <bits/stdc++.h>
using namespace std;
#define FILE_IO
class Treap
{
private:
struct _treap
{
int key, priority, sz;
_treap *lft, *rgt;
_treap()
{
key = priority = sz = 0;
lft = rgt = 0;
}
_treap(int _key, int _priority, int _sz, _treap *_lft, _treap *_rgt)
{
key = _key;
priority = _priority;
sz = _sz;
lft = _lft;
rgt = _rgt;
}
};
_treap *R, *nil;
int getRandomPriority()
{
int mod = (1 << 30) - 1;
int priority = (rand() & mod) + 1;
return priority;
}
void updateSize(_treap *&T)
{
if(T == nil) return;
T -> sz = T -> lft -> sz + 1 + T -> rgt -> sz;
}
void Balance(_treap *&T)
{
if(T -> priority < T -> lft -> priority)
rotateLeft(T);
if(T -> priority < T -> rgt -> priority)
rotateRight(T);
updateSize(T -> lft);
updateSize(T -> rgt);
updateSize(T);
}
void rotateLeft(_treap *&T)
{
_treap *_T = T -> lft;
T -> lft = _T -> rgt;
_T -> rgt = T;
T = _T;
}
void rotateRight(_treap *&T)
{
_treap *_T = T -> rgt;
T -> rgt = _T -> lft;
_T -> lft = T;
T = _T;
}
void Insert(_treap *&T, int pos, int key, int priority)
{
if(T == nil)
{
T = new _treap(key, priority, 1, nil, nil);
return;
}
if(T -> lft -> sz >= pos)
Insert(T -> lft, pos, key, priority);
else
Insert(T -> rgt, pos - T -> lft -> sz - 1, key, priority);
Balance(T);
}
void Print(_treap *&T)
{
if(T == nil) return;
Print(T -> lft);
printf("%d\n", T -> key);
Print(T -> rgt);
}
public:
Treap()
{
nil = new _treap;
nil -> lft = nil -> rgt = nil;
R = nil;
}
void Insert(int pos, int val)
{
Insert(R, pos - 1, val, getRandomPriority());
}
void Print()
{
Print(R);
}
};
Treap trp;
int main()
{
#ifdef FILE_IO
freopen("schi.in", "r", stdin);
freopen("schi.out", "w", stdout);
#endif
int N;
scanf("%d", &N);
for(int i = 1; i <= N; i++)
{
int x;
scanf("%d", &x);
trp.Insert(x, i);
}
trp.Print();
return 0;
}