Pagini recente » Cod sursa (job #283006) | Cod sursa (job #223843) | Cod sursa (job #1996976) | Cod sursa (job #1855963) | Cod sursa (job #744567)
Cod sursa(job #744567)
#include<cstdio>
#include<vector>
using namespace std;
class heap{
public:
vector <int> elem, pos, h;
heap(){
elem.assign(1, 0);
pos.assign(1, 0);
h.assign(1, 0);
}
void Coboara(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 Urca(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;
}
}
void Insereaza(int &x){
pos.push_back(h.size());
h.push_back(pos.size() - 1);
elem.push_back(x);
Urca(pos.size() - 1);
}
void Sterge(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();
Coboara(i);
Urca(i);
}
} 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.elem[H.pos[1]]);
else{
scanf("%d", &x);
if (cod == 1) H.Insereaza(x);
else H.Sterge(x);
}
}
}