Pagini recente » Cod sursa (job #635296) | Cod sursa (job #634422) | Cod sursa (job #635654) | Cod sursa (job #3146911) | Cod sursa (job #1865125)
// min heap
# include <bits/stdc++.h>
# define NR 200005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int HEAP[NR], positionInNode[NR], nodeOfPosition[NR];
int nrelem, elemintroduse, n, x, op;
void SWAP(int k1, int k2) {
int index1 = positionInNode[k1];
int index2 = positionInNode[k2];
positionInNode[k1] = index2;
positionInNode[k2] = index1;
nodeOfPosition[index1] = k2;
nodeOfPosition[index2] = k1;
}
void moveUp (int K) {
while (K>1 && HEAP[K] < HEAP[K/2]) {
SWAP(K, K/2);
swap(HEAP[K], HEAP[K/2]);
K=K/2;
}
}
void moveDown (int K) {
int son = 0;
do {
son = 0;
if (2*K <= nrelem) {
son = 2*K;
}
if (2*K+1 <=nrelem && HEAP[2*K+1] < HEAP[2*K]) {
son = 2*K+1;
}
if (son && HEAP[son] < HEAP[K]) {
SWAP(son, K);
swap(HEAP[son], HEAP[K]);
K = son;
continue;
} else break;
} while (true);
}
int main ()
{
f>>n;
for (int i=1; i<=n; ++i) {
f>>op;
if (op == 1) { // insert
f>>x;
HEAP[++nrelem] = x;
++elemintroduse;
positionInNode[nrelem] = elemintroduse;
nodeOfPosition[elemintroduse] = nrelem;
moveUp(nrelem);
} else if (op == 2) { // delete
f>>x;
int node = nodeOfPosition[x];
SWAP(node, nrelem);
swap(HEAP[node], HEAP[nrelem]);
--nrelem;
moveDown(node);
} else {
g<<HEAP[1]<<"\n";
}
}
return 0;
}