Pagini recente » Cod sursa (job #54493) | Cod sursa (job #2632701) | Cod sursa (job #2952360) | Cod sursa (job #1668382) | Cod sursa (job #3131589)
//#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
std::ifstream cin("heapuri.in");
std::ofstream cout("heapuri.out");
class Heap{
vector<pair<int,int>> vals;
static int x;
void coboara(int poz){
if(poz*2+1 < vals.size() && vals[poz].second > vals[poz*2+1].second){
pair<int,int> temp = vals[poz];
vals[poz] =vals[poz*2+1];
vals[poz*2+1]=temp;
return coboara(poz*2+1);
}if(poz*2+2 < vals.size() && vals[poz].second > vals[poz*2+2].second){
pair<int,int> temp = vals[poz];
vals[poz] =vals[poz*2+2];
vals[poz*2+2]=temp;
return coboara(poz*2+2);
}
}
public:
void insert(int v){
vals.push_back({++x,v});
int aux = vals.size()-1;
while(aux && vals[aux].second < vals[(aux-1)/2].second){
pair<int,int> temp = vals[aux];
vals[aux] =vals[(aux-1)/2];
vals[(aux-1)/2]=temp;
aux = (aux-1)/2;
}
}
void remove(int poz){
for(int i = 0;i<vals.size();i++){
if(vals[i].first == poz){
int aux = vals.size()-1;
pair<int,int> temp = vals[aux];
vals[aux] =vals[i];
vals[i]=temp;
vals.pop_back();
aux = i;
while(aux && vals[aux].second < vals[(aux-1)/2].second){
pair<int,int> temp = vals[aux];
vals[aux] =vals[(aux-1)/2];
vals[(aux-1)/2]=temp;
aux = (aux-1)/2;
}
coboara(i);
}
}
}
int top(){
return vals[0].second;
}
};
int Heap::x =0;
int main() {
Heap h;
int n;
cin>>n;
for(int i = 0;i<n;i++){
int op;
cin>>op;
switch(op){
case 1:{
int x;
cin>>x;
h.insert(x);
break;
}
case 2:{
int x;
cin>>x;
h.remove(x);
break;
}
case 3:{
cout<<h.top()<<'\n';
}
}
}
return 0;
}