Pagini recente » Cod sursa (job #2160483) | Cod sursa (job #2895818) | Cod sursa (job #2430412) | Cod sursa (job #851054) | Cod sursa (job #991288)
Cod sursa(job #991288)
#include <fstream>
#include <vector>
inline unsigned PARENT(const unsigned x){ return x>>1; }
inline unsigned LEFT(const unsigned x){ return x<<1; }
inline unsigned RIGHT(const unsigned x){ return (x<<1)+1; }
int main(){
std::ifstream fin("heapuri.in");
std::ofstream fout("heapuri.out");
unsigned n;
fin>>n;
std::vector<unsigned> values(n+1),heap(n+1),pos(n+1);
unsigned nrval=0,heapsize=0;
unsigned x;
while(n--){
char op; fin>>op;
switch(op){
case '1':
fin>>x;
++nrval; ++heapsize;
values[nrval]=x;
//push to the heap
heap[heapsize]=nrval;
pos[nrval]=heapsize;
for(unsigned curr=heapsize;PARENT(curr)>0;){
if(values[heap[curr]]<values[heap[PARENT(curr)]]){
unsigned temp=heap[curr];
heap[curr]=heap[PARENT(curr)];
heap[PARENT(curr)]=temp;
pos[heap[curr]]=curr;
curr=PARENT(curr);
pos[heap[curr]]=curr;
}
else break;
}
break;
case '2':
fin>>x;
heap[pos[x]]=heap[heapsize];
pos[heap[heapsize]]=pos[x];
heapsize--;
for(unsigned curr=pos[x];;){
unsigned which=curr,min=values[heap[curr]];
if(LEFT(curr)<=heapsize&&values[heap[LEFT(curr)]]<min){
which=LEFT(curr);
min=values[heap[which]];
}
if(RIGHT(curr)<=heapsize&&values[heap[RIGHT(curr)]]<min){
which=RIGHT(curr);
min=values[heap[which]];
}
if(which==curr) break;
else{
unsigned temp=heap[curr];
heap[curr]=heap[which];
heap[which]=temp;
pos[heap[curr]]=curr;
pos[heap[which]]=which;
curr=which;
}
}
break;
case '3':
fout<<values[heap[1]]<<'\n';
break;
}
}
}