Pagini recente » Cod sursa (job #991680) | Cod sursa (job #171488) | Cod sursa (job #453608) | Cod sursa (job #1300564) | Cod sursa (job #1385089)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define inFile "heapuri.in"
#define outFile "heapuri.out"
#define MAX_N 200001
int v[MAX_N];
int p[MAX_N];
class heap {
public:
int h[MAX_N];
int n;
heap();
int top();
void up(int node);
void down(int node);
void ins(int val);
void del(int pos);
};
heap :: heap() {
memset(h, 0, sizeof(h));
n = 0;
}
int heap :: top() {
return v[h[1]];
}
void heap :: up(int node) {
int init = h[node];
while(node > 1 && v[init] < v[h[node/2]]) {
p[h[node/2]] = node;
h[node] = h[node/2];
node = node/2;
}
p[init] = node;
h[node] = init;
}
void heap :: down(int node) {
int son;
do {
son = 0;
if(2*node <= n)
son = 2*node;
if(2*node + 1 <= n)
if(v[h[2*node + 1]] < v[h[son]])
son = 2*node+1;
if(v[h[son]] > v[h[node]]) son = 0;
if(son) {
p[h[son]] = node;
p[h[node]] = son;
swap(h[node], h[son]);
node = son;
}
} while(son);
}
void heap :: ins(int val) {
++n;
h[n] = val;
p[val] = n;
up(n);
}
void heap :: del(int pos) {
p[h[n]] = pos;
h[pos] = h[n];
n--;
if(pos > 1 && v[h[pos]] < v[h[pos/2]])
up(pos);
else
down(pos);
}
int main() {
freopen(inFile, "r", stdin);
freopen(outFile, "w", stdout);
int q, code, val, i, nr_el = 0;
heap H;
scanf("%d", &q);
for(i = 1; i <= q; i++) {
scanf("%d", &code);
if(code == 3)
printf("%d\n", H.top());
else {
scanf("%d", &val);
if(code == 1) {
v[++nr_el] = val;
H.ins(nr_el);
}
else if(code == 2)
H.del(p[val]);
}
}
return 0;
}