Pagini recente » Cod sursa (job #2883162) | Cod sursa (job #3040281) | Istoria paginii preoni-2006/runda-4 | Cod sursa (job #2582960) | Cod sursa (job #1525302)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 200001
int Heap[NMAX];
int N;
int father(int node) {
return node/2;
}
int left_child(int node) {
return node<<1;
}
int right_child(int node) {
return 2 * node + 1;
}
void swap(int *x, int *y) {
int aux;
aux = *x;
*x = *y;
*y = aux;
}
int getMin(int Heap[NMAX]) {
return Heap[1];
}
void goDown(int Heap[NMAX], int N, int K) {
int child;
do{
child = 0;
if(left_child(K) <= N) {
child = left_child(K);
if(right_child(K) <= N && Heap[right_child(K)] < Heap[child]) {
child = right_child(K);
}
if(Heap[K] < Heap[child]) {
child = 0;
}
}
if(child) {
swap(&Heap[child], &Heap[father(child)]);
K = child;
}
} while(child);
}
void goUp(int Heap[NMAX], int N, int K) {
int key = Heap[K];
while(K > 1 && key < Heap[father(K)]) {
Heap[K] = Heap[father(K)];
K = father(K);
}
Heap[K] = key;
}
void insertHeap(int Heap[NMAX], int N, int key) {
Heap[++N] = key;
goUp(Heap, N, N);
}
void deleteHeap(int Heap[NMAX], int N, int K) {
Heap[K] = Heap[N--];
if(K > 1 && (Heap[K] > Heap[father(K)])) {
goUp(Heap, N, K);
}
else
goDown(Heap, N, K);
}
void buildHeap(int Heap[NMAX], int N) {
for(int nodes = N / 2; nodes > 0; --nodes) {
goDown(Heap, N, nodes);
}
}
void reads() {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &N);
}
int main(void) {
int code, k, x, poz[NMAX];
reads();
k = 0;
for(int i = 1; i <= N; ++i) {
scanf("%d", &code);
if(code != 3) {
if(code == 1) {
scanf("%d", &Heap[++k]);
poz[k] = Heap[k];
if(k > 1)
insertHeap(Heap, k - 1, Heap[k]);
} else {
scanf("%d", &x);
for(int j = 1; j <= i; ++j)
if(Heap[j] == poz[x]) {
deleteHeap(Heap, k, j);
break;
}
}
} else {
printf("%d\n", getMin(Heap));
}
}
return 0;
}