Pagini recente » Cod sursa (job #1407339) | Cod sursa (job #1059960) | Cod sursa (job #821951) | Cod sursa (job #819685) | Cod sursa (job #1196825)
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 200001
int heap[MAX], nh, poz[MAX], ntot, n, v[MAX];
void adauga(int x);
void scoate(int x);
void schimba(int poza, int pozb);
void upheap(int nod);
void downheap(int nod);
int main()
{
int i, op, x;
freopen("heaprui.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &n);
for(i=1; i<=n; i++){
scanf("%d", &op);
if(op==1){scanf("%d", &x);adauga(x);}
if(op==2){scanf("%d", &x);scoate(x);}
if(op==3){printf("%d\n", v[heap[1]]);}
}
return 0;
}
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 = 2*nod+1;
if(v[heap[nod]]>v[heap[fiumin]]){
schimba(nod, fiumin);
downheap(fiumin);
}
}
void upheap(int nod){
if(nod==1) return;
int tata = nod/2;
if(v[heap[tata]]>v[heap[nod]]){
schimba(tata, nod);
upheap(tata);
}
}
void adauga(int x){
v[++ntot] = x;
heap[++nh] = ntot;
poz[ntot] = nh;
upheap(nh);
}
void scoate(int x){
int p = poz[x];
schimba(poz[x], nh);
nh--;
downheap(p);
}
void schimba(int poza, int pozb){
swap(heap[poza], heap[pozb]);
swap(poz[heap[poza]], poz[heap[pozb]]);
}