Pagini recente » Cod sursa (job #1378557) | Cod sursa (job #2722253) | Cod sursa (job #198697) | Cod sursa (job #130950) | Cod sursa (job #1814716)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
#define DMAX 200005
int poz[DMAX];
int nrel, nrins;
int x;
struct HEAP{
int val, poz;// pozitia pe care a fost inserat initial
}Heap[DMAX];
void insereaza(){
nrel++;
Heap[nrel].val = x;
nrins++;
Heap[nrel].poz = nrins;
poz[nrins]= nrel;
int k = nrel;
while(Heap[k / 2].val > Heap[k].val && k >= 2){
swap(Heap[k / 2], Heap[k]);
swap(poz[Heap[k / 2].poz], poz[Heap[k].poz]);
k /= 2;
}
}
void sterge(){
Heap[poz[x]] = Heap[nrel];
poz[Heap[nrel].poz] = poz[x];
nrel--;
int k = poz[x];
while(Heap[k / 2].val > Heap[k].val && k >= 2){
swap(Heap[k / 2], Heap[k]);
swap(poz[Heap[k / 2].poz], poz[Heap[k].poz]);
k /= 2;
}
while((2 * k <= nrel && Heap[k].val > Heap[2 * k + 1].val) || (2 * k + 1 <= nrel && Heap[k].val > Heap[2 * k].val)){
if(Heap[2 * k + 1].val > Heap[2 * k].val){
swap(Heap[2 * k], Heap[k]);
swap(poz[Heap[2 * k].poz], poz[Heap[k].poz]);
k = k * 2;
} else {
swap(Heap[2 * k + 1], Heap[k]);
swap(poz[Heap[2 * k + 1].poz], poz[Heap[k].poz]);
k = k * 2 + 1;
}
}
}
int main() {
int N, i, op;
fin>>N;
for(i = 1; i <= N; ++i){
fin>>op;
if(op == 1) {
fin>>x; insereaza();
}
if(op == 2) {
fin>>x; sterge();
}
if(op == 3) {
fout<<Heap[1].val<<'\n';
}
}
return 0;
}