Pagini recente » Cod sursa (job #2133985) | Cod sursa (job #1844606) | Cod sursa (job #1187150) | Cod sursa (job #637175) | Cod sursa (job #792002)
Cod sursa(job #792002)
#include<fstream>
using namespace std;
#define Maxim 200005
int Val[Maxim],Heap[Maxim],Poz[Maxim];
int N,LG;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
void move_up(int X,int N){
int aux;
while(X/2 && Val[Heap[X]]<Val[Heap[X/2]]){
aux=Heap[X];
Heap[X]=Heap[X/2];
Heap[X/2]=aux;
Poz[Heap[X]]=X;
Poz[Heap[X/2]]=X/2;
X/=2;
}
}
void move_down(int X,int N){
int son,aux;
do{
son=0;
if(2*X<=N && Val[Heap[X]]>Val[Heap[2*X]]){
son=2*X;
if(2*X+1<=N && Val[Heap[X]]>Val[Heap[2*X+1]] && Val[Heap[son]]<Val[Heap[2*X+1]])
son=2*X+1;
}
if(son){
aux=Heap[X];
Heap[X]=Heap[son];
Heap[son]=aux;
Poz[Heap[X]]=X;
Poz[Heap[son]]=son;
}
}while(son);
}
int main(){
fin>>N;
Val[0]=99999999;
int x,y,i;
for( i=1;i<=N;i++){
fin>>x;
if(x==1){
fin>>y;
Val[++LG]=y;
Heap[LG]=LG;
Poz[LG]=LG;
move_up(LG,N);
}
if(x==2){
fin>>y;
Heap[Poz[y]]=Heap[LG];
Poz[Heap[LG]]=Poz[y];
Poz[y]=-1;
LG--;
if(Val[Heap[Poz[y]]]<Val[Heap[Poz[y]/2]])
move_up(Poz[Heap[LG+1]],LG);
else
move_down(Poz[Heap[LG+1]],LG);
}
if(x==3){
fout<<Val[Heap[1]]<<"\n";
}
}
fin.close();
fout.close();
return 0;
}