Pagini recente » Cod sursa (job #1657381) | Cod sursa (job #1421098) | Cod sursa (job #2093321) | Cod sursa (job #2375918) | Cod sursa (job #2952306)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int dim=2e5+10;
int value[dim],Time;//value[i]=valoarea elementului care a intrat in timpul i
int heap[dim],len;//heap[i]=timpul in care a intrat elementul de pe pozitia i in heap
int pos[dim];//pos[i]=pozitia in heap al elementului care a intrat in timpul i
void UpHead(int child){
while(child/2){
int parent=child/2;
if(value[heap[parent]]>value[heap[child]]){
swap(heap[parent],heap[child]);
pos[heap[parent]]=parent;
pos[heap[child]]=child;
child=parent;
}else{
return;
}
}
}
void DownHeap(int parent){
while(parent*2<=len){
int lChild=parent*2,rChild=parent*2+1,child=lChild;
if(rChild<=len&&value[heap[lChild]]>value[heap[rChild]]&&value[heap[parent]]>value[heap[rChild]]){
child=rChild;
}
if(heap[parent]>heap[child]){
swap(heap[parent],heap[child]);
pos[heap[parent]]=parent;
pos[heap[child]]=child;
parent=child;
}
}
}
int main(){
int nrOp;
fin>>nrOp;
while(nrOp--){
int op;
fin>>op;
if(op==1){
int x;
fin>>x;
value[++Time]=x;
heap[++len]=Time;
pos[Time]=len;
UpHead(len);
}
if(op==2){
int x;
fin>>x;
swap(heap[pos[x]],heap[len]);
pos[heap[x]]=x;
pos[heap[len]]=len;
len--;
DownHeap(heap[x]);
}
if(op==3){
fout<<value[heap[1]]<<'\n';
}
}
}