Pagini recente » Cod sursa (job #2056208) | Borderou de evaluare (job #2015890) | Cod sursa (job #2926466) | Cod sursa (job #1835883) | Cod sursa (job #2947730)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int MaxN = 200010;
int N, op, global, heap_length;
int value[MaxN], heap[MaxN], position[MaxN];
void Push(int val){
int aux;
while(val/2 > 0 && value[heap[val]] < value[heap[val/2]]){
swap(heap[val], heap[val/2]);
position[heap[val ]] = val;
position[heap[val/2]] = val/2;
val /= 2;
}
}
void Pop(int val){
int y=0;
while(val != y){
y = val;
if(y*2 <=heap_length && value[heap[val]] > value[heap[y*2 ]]) val = y * 2;
if(y*2+1<=heap_length && value[heap[val]] > value[heap[y*2+1]]) val = y * 2 + 1;
if(val == y) break;
swap(heap[val], heap[y]);
position[heap[val]] = val;
position[heap[y ]] = y;
}
}
int main()
{
f>>N;
for(;N;N--){
f>>op;
int x;
if(op<=2)
f>>x;
if(op==1){
global++;
value[global] = x;
heap_length++;
heap[heap_length] = global;
position[global] = heap_length;
Push(heap_length);
}else if(op==2){
value[x] = -1;
Push(position[x]);
position[heap[1]] = 0;
heap[1] = heap[heap_length];
heap_length--;
position[heap[1]] = 1;
if(heap_length > 1) Pop(1);
}else{
g<<value[heap[1]]<<'\n';
}
}
return 0;
}