Pagini recente » Cod sursa (job #1750354) | Cod sursa (job #2202169) | Cod sursa (job #1471768) | Cod sursa (job #1706670) | Cod sursa (job #3166189)
#include <fstream>
using namespace std;
const int Nmax = 200000;
struct hp{
int elements[Nmax + 1];
int loc[Nmax + 1];
int len = 1;
inline int parent(int poz){
return poz / 2;
}
inline int left_child(int poz){
return poz * 2;
}
inline int right_child(int poz){
return poz * 2 + 1;
}
void propagate_up(int poz){
while(poz > 1 && elements[parent(poz)] > elements[poz]){
swap(loc[loc[parent(poz)]], loc[loc[poz]]);
swap(elements[parent(poz)], elements[poz]);
poz = parent(poz);
}
}
void propagate_down(int poz){
int smallest = poz;
int left = left_child(poz);
int right = right_child(poz);
if(left < len && elements[left] < elements[smallest]){
smallest = left;
}
if(right < len && elements[right] < elements[smallest]){
smallest = right;
}
if(smallest != poz){
swap(loc[loc[poz]], loc[loc[smallest]]);
swap(elements[poz], elements[smallest]);
propagate_down(smallest);
}
}
void add(int val, int poz){
elements[len++] = val;
loc[poz] = len - 1;
propagate_up(len - 1);
}
int extract_min(){
int val = elements[1];
elements[1] = elements[--len];
elements[len] = 0;
propagate_down(1);
return val;
}
int getMin(){
return elements[1];
}
void update(int poz, int val){
int old_val = elements[poz];
elements[poz] = val;
if(old_val > val){
propagate_up(poz);
}
else{
propagate_down(poz);
}
}
void del(int poz_to_delete){
int poz = loc[poz_to_delete];
update(poz, getMin());
extract_min();
}
};
hp heap;
int main(){
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, op, x, poz, pos_to_delete;
fin >> n;
poz = 1;
while(n--){
fin >> op;
if(op == 1){
fin >> x;
heap.add(x, poz++);
}
else if(op == 2){
fin >> pos_to_delete;
heap.del(pos_to_delete);
}
else{
fout << heap.getMin() << '\n';
}
}
return 0;
}