Pagini recente » Cod sursa (job #339967) | Cod sursa (job #3203353) | Cod sursa (job #120273) | Cod sursa (job #2461618) | Cod sursa (job #2836718)
#include <bits/stdc++.h>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int N = 2e5 + 1;
int n, op, val, h;
int crono[N], timp;
int heap[N];
void urca(int p){
while(heap[p] < heap[p / 2]){
swap(heap[p], heap[p / 2]);
swap(crono[p], crono[p / 2]);
p /= 2;
}
}
void coboara(int p){
int bun = p;
if(2 * p <= h && heap[2 * p] < heap[bun])
bun = 2 * p;
if(2 * p + 1 <= h && heap[2 * p + 1] < heap[bun])
bun = 2 * p + 1;
if(bun != p){
swap(heap[p], heap[bun]);
swap(crono[p], crono[bun]);
coboara(bun);
}
}
void minim(){
g << heap[1] << '\n';
heap[1] = heap[h];
crono[1] = crono[h--];
coboara(1);
}
void insereaza(int val){
heap[++h] = val;
crono[h] = ++timp;
urca(h);
}
void sterge(int cronp){
int p = crono[cronp];
if(p == h){
h--;
return;
}
heap[p] = heap[h];
crono[p] = crono[h];
if(heap[p] < heap[p / 2])
urca(p);
else
coboara(p);
}
int main(){
f >> n;
while(n--){
f >> op;
if(op == 1){
f >> val;
insereaza(val);
}else if(op == 2){
f >> val;
sterge(val);
}else
minim();
}
f.close();
g.close();
}