Pagini recente » Cod sursa (job #423269) | Cod sursa (job #1237583) | Cod sursa (job #2410570) | Cod sursa (job #1333219) | Cod sursa (job #1864863)
# include <bits/stdc++.h>
# define NR 200005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int i,j,n,m,x,op,elem;
int HEAP[NR], positionOfIndex[NR], indexOnPosition[NR];
void SWAP(int k1, int k2) {
int index1 = indexOnPosition[k1];
int index2 = indexOnPosition[k2];
positionOfIndex[index1] = k2;
positionOfIndex[index2] = k1;
swap(indexOnPosition[k1], indexOnPosition[k2]);
}
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 <= elem) {
son = 2*K;
if (2*K+1 <= elem && HEAP[2*K+1] < HEAP[2*K]) {
son = 2*K+1;
}
}
// swap
if (son && HEAP[son] < HEAP[K]) {
SWAP(K, son);
swap(HEAP[son], HEAP[K]);
K = son;
}
} while (son);
}
int main ()
{
f>>n;
for (int i=1; i<=n; ++i) {
f>>op;
if (op == 1) { // insereaza
f>>x;
HEAP[++elem] = x;
positionOfIndex[i] = elem;
indexOnPosition[elem] = i;
moveUp(elem);
} else if (op == 2) { // sterge
f>>x;
// we delete the element on position positionOfIndex[x];
int poz = positionOfIndex[x];
SWAP(elem, poz);
swap(HEAP[elem], HEAP[poz]);
--elem;
moveDown(poz);
}
else {
g<<HEAP[1]<<"\n";
}
}
return 0;
}