Pagini recente » Cod sursa (job #1183430) | Cod sursa (job #2785833) | Cod sursa (job #2148241) | Cod sursa (job #1265912) | Cod sursa (job #791167)
Cod sursa(job #791167)
#include<fstream>
using namespace std;
#define NMax 200003
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
typedef int Heap[NMax];
Heap H;
int N,LH;
int Ord[NMax]; // Pozitia al-i-lui nod introdus in Heap
int HOrd[NMax]; // Numarul de ordine al-i-lui nod din Heap
inline int father(int X){
return X/2;
}
inline int left_son(int X){
return X*2;
}
inline int right_son(int X){
return X*2+1;
}
void percolate(Heap H,int Dim,int K){
int key=H[K],val=K;
while(father(K)>0 && key<H[father(K)]){
H[K]=H[father(K)];
swap(Ord[val],Ord[father(K)]);
swap(HOrd[K],HOrd[father(K)]);
K=father(K);
}
H[K]=key;
}
void sift(Heap H,int Dim,int K){
int son,val=K;
do{
son=0;
if(left_son(K)<=Dim){
son=left_son(K);
if(right_son(K)<=N && H[right_son(K)]<H[left_son(K)])
son=right_son(K);
if(H[K]<=H[son])
son=0;
}
if(son){
swap(H[K],H[son]);
swap(Ord[val],Ord[son]);
swap(HOrd[K],HOrd[son]);
K=son;
}
}while(son);
}
int main(){
fin>>N;
int x,y;
for(int i=1;i<=N;i++){
fin>>x;
if(x==3)
fout<<H[1]<<"\n";
else if(x==2){
fin>>y;
H[Ord[y]]=H[Ord[HOrd[LH]]];
Ord[HOrd[LH]]=Ord[y];
HOrd[Ord[y]]=HOrd[LH];
LH--;
if(H[Ord[y]]<H[father(Ord[y])]){
percolate(H,LH,Ord[y]);
}
else{
sift(H,LH,Ord[y]);
}
}
else{
fin>>y;
H[++LH]=y;
Ord[LH]=LH;
HOrd[LH]=LH;
percolate(H,LH,LH);
}
}
fin.close();
fout.close();
return 0;
}