Pagini recente » Cod sursa (job #1688637) | Cod sursa (job #1181141) | Cod sursa (job #499688) | Cod sursa (job #2318357) | Cod sursa (job #1713333)
#include <cstdio>
#define MAXN 200000
using namespace std;
int n, v[MAXN], heap[MAXN], poz[MAXN];
inline int tata(int nod){
return (nod-1)/2;
}
inline int fiust(int nod){
return nod*2+1;
}
inline int fiudr(int nod){
return nod*2+2;
}
inline void swap(int p,int q){
int aux;
aux=heap[p];
heap[p]=heap[q];
heap[q]=aux;
poz[heap[p]]=p;
poz[heap[q]]=q;
}
inline void urcare(int p){
while ((p>0)&&(v[heap[p]]<v[heap[tata(p)]])){
swap(p, tata(p));
p=tata(p);
}
}
inline void coborare(int p){
int f, fiu;
f=1;
while ((f) && (fiust(p)<n)){
fiu=fiust(p);
if ((fiudr(p)<n) && (v[heap[fiudr(p)]]<v[heap[fiu]]))
fiu=fiudr(p);
if (v[heap[fiu]]<v[heap[p]]){
swap(p, fiu);
p=fiu;
}else
f=0;
}
}
inline void adauga(int p){
heap[n]=p;
poz[p]=n;
n++;
urcare(n-1);
}
inline void sterge(int p){
heap[poz[p]]=heap[n-1];
poz[heap[n-1]]=poz[p];
n--;
if ((poz[p]>0) && (v[heap[poz[p]]]<v[heap[tata(poz[p])]]))
urcare(poz[p]);
else
coborare(poz[p]);
}
int main(){
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, q, k, t, x;
scanf("%d", &q);
n=0; //numarul de noduri curente
k=0; //cate elemente am citit
for (i=1; i<=q; i++){
scanf("%d", &t);
if (t==3)
printf("%d\n", v[heap[0]]);
else{
scanf("%d", &x);
if (t==1){
v[k]=x;
adauga(k);
k++;
}else
sterge(x-1);
}
}
return 0;
}