Pagini recente » Istoria paginii runda/cosmin_oni2018z2 | Cod sursa (job #2089898) | Istoria paginii runda/leiten | Cod sursa (job #182445) | Cod sursa (job #1960003)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct elem
{
int x, cine;
};
void ins(int nr, int p);
void del(int p);
int n, m, num, poz[200005];
elem H[200005];
int main()
{
int i, op, x;
fin >> m;
for (i = 1; i <= m; i++)
{
fin >> op;
if (op == 1 || op == 2)
{
fin >> x;
if (op == 1)
ins(x,++num);
else del(x);
}
else fout << H[1].x << '\n';
}
return 0;
}
void ins(int nr, int p)
{
int tata, fiu;
fiu = ++n;
tata = n / 2;
while (tata && nr < H[tata].x)
{
poz[H[tata].cine] = fiu;
H[fiu] = H[tata];
fiu = tata;
tata = fiu / 2;
}
poz[p] = fiu;
H[fiu].x = nr;
H[fiu].cine = p;
}
void del(int p)
{
int tata, fiu;
H[poz[p]] = H[n--];
poz[H[poz[p]].cine] = poz[p];
tata = poz[p];
while (1)
{
fiu = 2 * tata;
if (fiu > n)
break;
if (fiu < n && H[fiu].x > H[fiu + 1].x)
fiu++;
if (H[tata].x <= H[fiu].x)
break;
poz[H[fiu].cine] = tata;
poz[H[tata].cine] = fiu;
swap(H[tata], H[fiu]);
tata = fiu;
}
}