Pagini recente » Cod sursa (job #229638) | Cod sursa (job #1909070) | Cod sursa (job #1637281) | Cod sursa (job #1065456) | Cod sursa (job #717567)
Cod sursa(job #717567)
#include <stdio.h>
#include <assert.h>
#define maxn 200010
int N, L, NR;
int A[maxn], Heap[maxn], Pos[maxn];
#define SWAP(a, b){\
a = a + b;\
b = a - b;\
a = a - b;\
}
inline int getLeft(int p){ return 2 * p;}
inline int getRight(int p){ return 2 * p + 1;}
inline int getParent(int p){ return p / 2;}
inline int getMin(){ return A[Heap[1]];}
void up(int p){
while(p > 1 && (A[Heap[p]] < A[Heap[getParent(p)]])){
SWAP(Heap[p], Heap[getParent(p)]);
Pos[Heap[p]] = p;
Pos[Heap[getParent(p)]] = getParent(p);
p = getParent(p);
}
}
void down(int p){
int son;
do{
son = 0;
if(getLeft(p) <= L){
son = getLeft(p);
if(getRight(p) <= L && A[Heap[son]] > A[Heap[getRight(p)]])
son = getRight(p);
}
if(son){
if(A[Heap[son]] < A[Heap[p]]){
SWAP(Heap[son], Heap[p])
Pos[Heap[son]] = son;
Pos[Heap[p]] = p;
p = son;
}
else
son = 0;
}
}while(son);
}
void insert(int key){
++NR, ++L;
A[NR] = key;
Heap[L] = NR;
Pos[NR] = L;
up(L);
}
void cut(int p){
/*A[p] = -1;
up(Pos[p]);
Pos[Heap[1]] = 0;
Heap[1] = Heap[L--];
Pos[Heap[1]] = 1;
if(L>1)
down(1);
*/
int pos = Pos[p];
A[p] = -1;
Pos[p] = 0;
if(pos != L){
Heap[pos] = Heap[L--];
Pos[Heap[pos]] = pos;
if(L > 1){
if(pos > 1 && A[Heap[pos]] < A[Heap[getParent(pos)]])
up(pos);
else
down(pos);
}
}
else
--L;
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, x, cod;
scanf("%d ", &N);
for (i=1; i<=N; i++)
{
scanf("%d ", &cod);
if (cod == 1)
{
scanf("%d", &x);
insert(x);
}
if (cod == 2)
{
scanf("%d", &x);
cut(x);
}
if (cod == 3){
printf("%d\n", getMin());
}
}
return 0;
}