Pagini recente » Cod sursa (job #2770874) | Cod sursa (job #1421307) | Cod sursa (job #1408917) | Cod sursa (job #2171041) | Cod sursa (job #2129043)
#include <iostream>
#include <fstream>
#define nMax 200003
#define SWAP(a, b) (v[0] = v[a], v[a] = v[b], v[b] = v[0])
#define SWAP_ORD(a, b) (ord[0] = ord[ord_1[a]], ord[ord_1[a]] = b, ord[ord_1[b]] = ord[0], ord_1[0] = ord_1[a], ord_1[a] = ord_1[b], ord_1[b] = ord_1[0])
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[nMax], n_heap = 0;
int ord[nMax], ord_1[nMax], n_ord = 0;
void add(int x){
int nod = ++ n_heap;
v[nod] = x;
while(nod != 1 && v[nod] < v[nod / 2]){
SWAP(nod, nod / 2);
ord[ord_1[nod / 2]] = nod;
ord_1[nod] = ord_1[nod / 2];
nod = nod / 2;
}
ord[++ n_ord] = nod;
ord_1[nod] = n_ord;
return;
}
void remove(int nod){
int minim;
ord_1[nod] = ord_1[n_heap];
v[nod] = v[n_heap];
-- n_heap;
while(nod != 1 && v[nod] < v[nod / 2]){
SWAP(nod, nod / 2);
SWAP_ORD(nod, nod / 2);
nod = nod / 2;
}
while(true){
if(nod * 2 > n_heap){
break;
}
if(nod * 2 == n_heap){
minim = 2 * nod;
}
else{
minim = (v[2 * nod] < v[2 * nod + 1] ? (2 * nod) : (2 * nod + 1));
}
if(v[nod] < v[minim]){
break;
}
SWAP(nod, minim);
SWAP_ORD(nod, minim);
nod = minim;
}
return;
}
int main(){
int n, o , x;
fin>>n;
while(n --){
fin>>o;
switch(o){
case 1:
fin>>x;
add(x);
break;
case 2:
fin>>x;
remove(ord[x]);
break;
default:
fout<<v[1]<<"\n";
break;
}
}
return 0;
}