Pagini recente » Cod sursa (job #2363871) | Cod sursa (job #2492212) | Cod sursa (job #2902989) | Cod sursa (job #1304760) | Cod sursa (job #2289852)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int NMAX = 200000, oo = 10000000;
struct Nod{int val; int cod;} Heap[NMAX + 5];
int Poz[NMAX + 5], T, K, ct;///pozitia in heap a nodului i este Poz[i]
///implementare operatii heap
void AddNod(Nod N)
{
Heap[++K] = N, Poz[N.cod] = K;
int i = K;
///urcare
while(i > 1 && Heap[i].val < Heap[i / 2].val) {
swap(Heap[i], Heap[i / 2]);
swap(Poz[Heap[i].cod], Poz[Heap[i / 2].cod]);
i /= 2;
}
}
void DeleteNod(int nume)
{
int i = Poz[nume];
Heap[i] = Heap[K], Poz[Heap[i].cod] = Poz[Heap[K--].cod];
Heap[K + 1] = {oo, 0}, Heap[K + 2] = {oo, 0};
///cobor
while(Heap[i].val > Heap[2 * i].val || Heap[i].val > Heap[2 * i + 1].val) {
int nextpoz;
if(Heap[2 * i].val < Heap[2 * i + 1].val)
nextpoz = 2 * i;
else
nextpoz = 2 * i + 1;
swap(Heap[nextpoz], Heap[i]);
swap(Poz[Heap[nextpoz].cod], Poz[Heap[i].cod]);
i = nextpoz;
if(2 * i > K) break;
}
}
int main()
{
fin >> T;
while(T--) {
int op, x;
fin >> op;
if(op == 3)
fout << Heap[1].val << '\n';
if(op == 2) {
fin >> x;
DeleteNod(x);
}
if(op == 1) {
fin >> x;
AddNod({x, ++ct});
}
}
fin.close();
fout.close();
return 0;
}