Pagini recente » Cod sursa (job #1700812) | Istoria paginii runda/lotul_pestisorilor | Cod sursa (job #2363891) | Cod sursa (job #2037981) | Cod sursa (job #1647897)
#include <bits/stdc++.h>
#define F first
#define S second
#define dad (node >> 1)
#define leftSon (node << 1)
#define rightSon ((node << 1) | 1)
using namespace std;
const int Nmax = 2e5 + 10;
int pos[Nmax] , nr , k;
pair < int , int > H[Nmax];
int best(int x , int y)
{
return (H[x].F < H[y].F) ? x : y;
}
void suap(int x , int y)
{
swap(H[x].F , H[y].F);
swap(H[x].S , H[y].S);
swap(pos[H[x].S] , pos[H[y].S]);
}
void heapup(int node)
{
if (node == 1) return;
if (best(dad , node) == node)
{
suap(dad , node);
heapup(dad);
}
}
void heapdown(int node)
{
int to;
bool l = 0, r = 0;
if (leftSon <= nr && best(node , leftSon) == leftSon) l = 1;
if (rightSon <= nr && best(node , rightSon) == rightSon) r = 1;
if (!l && !r) return;
if (l && r) to = best(leftSon , rightSon);
else if (l) to = leftSon;
else if (r) to = rightSon;
suap(node , to);
heapdown(to);
}
void add()
{
int x;
scanf("%d", &x);
pos[++k] = ++nr;
H[nr] = {x , k};
heapup(nr);
}
void del()
{
int x;
scanf("%d", &x);
x = pos[x];
int p = x;
suap(x , nr);
nr--;
heapdown(p);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int n , op;
for (scanf("%d", &n); n ; --n)
{
scanf("%d", &op);
if (op == 1) add();
if (op == 2) del();
if (op == 3) printf("%d\n", H[1].F);
}
return 0;
}