Pagini recente » Cod sursa (job #1593558) | Cod sursa (job #431098) | Cod sursa (job #1354540) | Profil Daria09 | Cod sursa (job #744568)
Cod sursa(job #744568)
#include<cstdio>
#include<vector>
using namespace std;
class heap{
vector <int> elem, pos, h;
void Up(int i){
int fiu;
while (i <= (int)(pos.size() - 1) / 2){
fiu = 2 * i;
if (fiu + 1 <= (int)pos.size() - 1 && elem[pos[fiu+1]] < elem[pos[fiu]]) fiu++;
if (elem[pos[i]] > elem[pos[fiu]]){
swap(h[pos[i]], h[pos[fiu]]);
swap(pos[i], pos[fiu]);
i = fiu;
}
else break;
}
}
void Down(int i){
int tata = i/2;
while (i > 1 && elem[pos[i]] < elem[pos[tata]]){
swap(h[pos[i]], h[pos[tata]]);
swap(pos[i], pos[tata]);
i = tata; tata = i/2;
}
}
public:
heap(){
elem.assign(1, 0);
pos.assign(1, 0);
h.assign(1, 0);
}
void insert(int &x){
pos.push_back(h.size());
h.push_back(pos.size() - 1);
elem.push_back(x);
Up(pos.size() - 1);
}
void erase(int &x){
int i = h[x];
swap(h[pos[pos.size() - 1]], h[pos[h[x]]]);
swap(pos[pos.size() - 1], pos[h[pos[pos.size() - 1]]]);
pos.pop_back();
Down(i);
Up(i);
}
int top(){ return elem[pos[1]]; }
} H;
int main(){
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, cod, x, op;
scanf ("%d", &op);
for (i = 0; i < op; i++){
scanf("%d", &cod);
if (cod == 3) printf("%d\n", H.top());
else{
scanf("%d", &x);
if (cod == 1) H.insert(x);
else H.erase(x);
}
}
}