Pagini recente » Cod sursa (job #3127748) | Cod sursa (job #1731487) | Cod sursa (job #918478) | Cod sursa (job #1355447) | Cod sursa (job #1206846)
#include <cstdio>
using namespace std;
#define MAX 200001
int v[MAX], poz[MAX], heap[MAX], n, nv, nh;
void add(int x);
void upheap(int nod);
void del(int x);
void downheap(int nod);
void schimba(int a, int b);
int main()
{
int i, x, cod;
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &n);
for(i=1; i<=n; i++){
scanf("%d", &cod);
if(cod==3) printf("%d\n", v[heap[1]]);
else{
scanf("%d", &x);
if(cod==1) add(x);
else del(x);
}
}
return 0;
}
void add(int x){
v[++nv] = x;
heap[++nh] = nv;
poz[nv] = nh;
upheap(nh);
}
void upheap(int nod)
{
if(nod==1) return;
if(v[heap[nod]]<v[heap[nod/2]]){
schimba(nod, nod/2);
upheap(nod/2);
}
}
void schimba(int a, int b){
int aux;
aux = heap[a]; heap[a] = heap[b]; heap[b] = aux;
aux = poz[heap[a]]; poz[heap[a]] = poz[heap[b]]; poz[heap[b]] = aux;
}
void del(int x){
int p = poz[x];
schimba(p, nh);
nh--;
downheap(p);
}
void downheap(int nod){
if(nod*2>nh) return;
int fiumin = nod*2;
if(nod*2+1<=nh and v[heap[fiumin]]>v[heap[nod*2+1]])
fiumin++;
if(v[heap[nod]]>v[heap[fiumin]]){
schimba(nod, fiumin);
downheap(fiumin);
}
}