Pagini recente » Cod sursa (job #2638627) | Cod sursa (job #1000469) | Istoria paginii runda/parfum_de_iasomnie | Cod sursa (job #2638556) | Cod sursa (job #1987118)
#include <bits/stdc++.h>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int NMax = (1 << 18) + 1;
int n,x,nr;
int a[NMax],poz[NMax];
struct node{
int value;
int time;
};
int Size;
node heap[NMax];
void go_up(int node){
while(node > 1 && heap[node / 2].value > heap[node].value){
swap(poz[heap[node].time],poz[heap[node / 2].time]);
swap(heap[node],heap[node / 2]);
node = node / 2;
}
}
void go_down(int node){
while((heap[2 * node].value < heap[node].value && 2 * node <= Size) || (heap[2 * node + 1].value < heap[node].value && 2 * node + 1 <= Size)){
if(2 * node + 1 > Size){
swap(poz[heap[node].time],poz[heap[2 * node].time]);
swap(heap[node],heap[2 * node]);
node = node * 2;
continue;
}else
if(heap[2 * node].value < heap[2 * node + 1].value && 2 * node <= Size){
swap(poz[heap[node].time],poz[heap[2 * node].time]);
swap(heap[node],heap[2 * node]);
node = node * 2;
}else{
swap(poz[heap[node].time],poz[heap[2 * node + 1].time]);
swap(heap[node],heap[2 * node + 1]);
node = node * 2 + 1;
}
}
}
void heap_insert(int x){
heap[++Size].value = x;
heap[Size].time = nr;
poz[nr] = Size;///poz[i] - pozitia(nodul) elementului al i-lea adaugat
go_up(Size);
}
void heap_erase(int node){
swap(poz[heap[node].time],poz[heap[Size].time]);
swap(heap[node],heap[Size]);
Size--;
go_down(node);
}
int main()
{
f >> n;
for(int i = 1; i <= n; ++i){
f >> x;
if(x == 1){
f >> a[++nr];///al nr-lea element adaugat
heap_insert(a[nr]);
}else
if(x == 2){
int t;
f >> t;
heap_erase(poz[t]);///elimin nodul poz[t]
}else
if(x == 3){
g << heap[1].value << '\n';
}
}
return 0;
}