Pagini recente » Cod sursa (job #326569) | Cod sursa (job #1318277) | Cod sursa (job #2484775) | Cod sursa (job #1638138) | Cod sursa (job #792001)
Cod sursa(job #792001)
#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]] && 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]]=Heap[Poz[y]];
if(Val[Heap[Poz[y]]]<Val[Heap[Poz[y]/2]])
move_up(Poz[y],LG);
else
move_down(Poz[y],LG);
}
if(x==3){
fout<<Val[Heap[1]]<<"\n";
}
}
fin.close();
fout.close();
return 0;
}