Pagini recente » Cod sursa (job #1951876) | Cod sursa (job #1963471) | Cod sursa (job #2849444) | Cod sursa (job #694775) | Cod sursa (job #772652)
Cod sursa(job #772652)
/*
Heap-uri.
*/
#include <iostream>
#include <stdio.h>
#define MAXN 200000
#define STANG(i) (2 * i)
#define DREPT(i) (2 * i + 1)
using namespace std;
int n, sz_heap, sz;
int heap[MAXN], poz[MAXN], vector[MAXN];
void swap(int *a, int *b) {
int aux = *a;
*a = *b;
*b = aux;
}
void filtru_sus (int i) {
while (i > 1 && vector[heap[i]] < vector[heap[i / 2]]) {
swap(poz[heap[i]], poz[heap[i / 2]]);
swap(heap[i], heap[i / 2]);
i = i / 2;
}
}
void filtru_jos (int i) {
int p = 1;
while (p) {
p = 0;
if (STANG(i) <= sz_heap) {
p = STANG(i);
if (DREPT(i) <= sz_heap && vector[heap[p + 1]] < vector[heap[p]])
++p;
if (p) {
swap(poz[heap[p]], poz[heap[i]]);
swap(heap[p], heap[i]);
i = p;
}
}
}
}
void adauga (int x) {
vector[++sz] = x;
heap[++sz_heap] = sz;
poz[sz] = sz_heap;
filtru_sus(sz_heap);
}
void sterge (int x) {
poz[heap[sz_heap]] = x;
swap(heap[x], heap[sz_heap]);
--sz_heap;
if (x > 1 && vector[heap[x]] < vector[heap[x / 2]])
filtru_sus(x);
else
filtru_jos(x);
}
int main () {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, tip_operatie, x;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf("%d", &tip_operatie);
switch (tip_operatie) {
case 1: {
scanf("%d", &x);
adauga(x);
}
break;
case 2: {
scanf("%d", &x);
sterge(poz[x]);
}
break;
case 3: {
printf("%d\n", vector[heap[1]]);
}
break;
}
}
return 0;
}