Pagini recente » Cod sursa (job #1726280) | Cod sursa (job #483885) | Cod sursa (job #2415705) | Cod sursa (job #391114) | Cod sursa (job #744563)
Cod sursa(job #744563)
#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 <= (elem.size() - 1)/ 2){
fiu = 2 * i;
if (fiu + 1 <= elem.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){
int no = h.size(), n = pos.size();
elem.push_back(x);
h.push_back(n);
pos.push_back(no);
Urca(elem.size() - 1);
}
void Sterge(int &x){
int i = h[x];
swap(h[pos[elem.size() - 1]], h[pos[h[x]]]);
swap(pos[elem.size() - 1], pos[h[pos[elem.size() - 1]]]);
elem.pop_back(), h.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);
}
}
return 0;
}