Pagini recente » Cod sursa (job #256851) | Monitorul de evaluare | Cod sursa (job #1580464) | Cod sursa (job #263850) | Cod sursa (job #2858127)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int NMAX=200005;
int N, L, v[NMAX], heap[NMAX], val[NMAX], poz[NMAX];
void upHeap(int p){
while(p>1 and val[heap[p]]<val[heap[p/2]]){
swap(poz[heap[p]],poz[heap[p/2]]);
swap(heap[p],heap[p/2]);
p=p/2;
}
}
void downHeap(int p){
while(p*2+1<=L and (val[heap[2*p]]<val[heap[p]] or val[heap[2*p*1]]<val[heap[p]])){
if(val[heap[2*p]]<val[heap[2*p+1]]){
swap(poz[heap[p]],poz[heap[p*2]]);
swap(heap[p],heap[p*2]);
p=p*2;
}
else{
swap(poz[heap[p]],poz[heap[p*2+1]]);
swap(heap[p],heap[p*2+1]);
p=p*2+1;
}
}
if(p*2==L and val[heap[2*p]]<val[heap[p]]){
swap(poz[heap[p]],poz[heap[p*2]]);
swap(heap[p],heap[p*2]);
p=p*2;
}
}
void pushHeap(int i){
L++;
poz[i]=L;
heap[L]=i;
upHeap(L);
}
int getMinHeap(){
return val[heap[1]];
}
void popHeap(int p){
swap(poz[heap[p]],poz[heap[L]]);
swap(heap[p],heap[L]);
L--;
if(p>1 and val[heap[p]]<val[heap[p/2]])
upHeap(p);
else
downHeap(p);
}
int main()
{
fin>>N;
int t, x, i=0;
while(N--){
fin>>t;
if(t==1){
fin>>x;
val[++i]=x;
pushHeap(i);
}
else if(t==2){
fin>>x;
popHeap(poz[x]);
}
else{
fout<<getMinHeap()<<'\n';
}
}
fin.close();
fout.close();
return 0;
}