Pagini recente » Cod sursa (job #3150878) | Cod sursa (job #1122981) | Cod sursa (job #2483429) | Cod sursa (job #2883899) | Cod sursa (job #2809726)
#include <fstream>
#define NMAX 200000
using namespace std;
ifstream cin ("heapuri.in");
ofstream cout ("heapuri.out");
int nheap;
int vheap[NMAX + 1], vpoz1[NMAX + 1], vpoz2[NMAX + 1];
/// vpoz1[node] = al catelea element din sirul de adaugari este elementul din nodul node
/// vpoz2[i] = in ce nod se afla al i-lea element din sirul de adaugari
static inline int GetMinNode(int node) { /// returneaza nodeul minimului dintre nodul curent si cei doi copii
int min, pozmin;
min = vheap[node];
pozmin = node;
if (node * 2 + 1 < nheap && vheap[node * 2 + 1] < min)
min = vheap[node * 2 + 1], pozmin = node * 2 + 1;
if (node * 2 + 2 < nheap && vheap[node * 2 + 2] < min)
min = vheap[node * 2 + 2], pozmin = node * 2 + 2;
return pozmin;
}
static inline void myswap (int& a, int &b) {
int aux;
aux = a;
a = b;
b = aux;
}
void add(int node, int val, int poz) {
vheap[node] = val;
vpoz1[node] = poz;
vpoz2[poz] = node;
while (vheap[node] < vheap[(node - 1) / 2]) {
myswap(vheap[node], vheap[node / 2]);
myswap(vpoz1[node], vpoz1[node / 2]);
vpoz2[vpoz1[node]] = node;
vpoz1[node / 2] = poz;
vpoz2[poz] = node / 2;
node /= 2;
}
}
void erase(int node) {
int nodemin;
myswap(vheap[node], vheap[nheap - 1]);
vpoz1[node] = vpoz1[nheap - 1];
nheap--;
nodemin = GetMinNode(node);
while (nodemin != node) {
myswap(vheap[node], vheap[nodemin]);
myswap(vpoz1[node], vpoz1[nodemin]);
vpoz2[vpoz1[node]] = nodemin; vpoz2[vpoz1[nodemin]] = node;
node = nodemin;
nodemin = GetMinNode(node);
}
}
int main() {
int q, op, val, nadd;
cin >> q;
nadd = nheap = 0;
while (q--) {
cin >> op;
if (op == 1) {
cin >> val;
if (val == 12)
val = 12;
add(nheap, val, nadd);
nadd++; nheap++;
}
else if (op == 2) {
cin >> val;
erase(vpoz2[val - 1]);
}
else
cout << vheap[0] << "\n";
}
return 0;
}