Pagini recente » Cod sursa (job #550163) | Cod sursa (job #2802692) | Cod sursa (job #2368646) | Cod sursa (job #1693294) | Cod sursa (job #1360159)
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
long n,heap[200009],nr,len;
long pozitie[200009];
long valori[200009];
void sift(int N,int k){
int son=0;
while(son != k){
son=k;
if(son*2<=N && valori[heap[k]]>valori[heap[son*2]]) k = son*2;
if(son*2+1 <=N && valori[heap[k]]>valori[heap[son*2+1]]) k=son*2+1;
swap(heap[k],heap[son]);
pozitie[heap[k]]=k;
pozitie[heap[son]]=son;
}
}
void percolate(int zice,int k){
int val = heap[k];
while(k/2 && valori[heap[k/2]]>valori[val] ){
swap(heap[k],heap[k/2]);
pozitie[heap[k]]=k;
pozitie[heap[k/2]]=k/2;
k/=2;
}
}
int main()
{ long x;
int op;
f>>nr;
for(int i=1;i<=nr;i++){
f>>op;
if(op==1){
f>>x;
valori[++n] = x;
heap[++len]= n;
pozitie[n]=len;
percolate(len,len);
}
else if(op == 2){
f>>x;
valori[x]=-1;
percolate(len,pozitie[x]);
pozitie[heap[1]]=0;
heap[1]=heap[len--];
pozitie[heap[1]]=1;
if(len>1) sift(len,1);
}
else g<<valori[heap[1]]<<endl;
}
f.close();g.close();
return 0;
}