Pagini recente » Cod sursa (job #891633) | Cod sursa (job #1811072) | Cod sursa (job #2136119) | Cod sursa (job #3281436) | Cod sursa (job #2322748)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("heapuri.in");
ofstream fo("heapuri.out");
const int NMAX = (2e5) + 5;
int q;
int H[NMAX], key[NMAX]; /// key[i] = cheia celui intrat al i-lea
int inv[NMAX]; /// al catulea a intrat cel cu cheia i
int k, n;
void interschimba(int a, int b)
{
swap(H[a], H[b]);
int orda = inv[a], ordb = inv[b];
swap(inv[a], inv[b]);
swap(key[orda], key[ordb]);
}
void coboara(int ch)
{
if ((H[ch * 2] < H[ch] && ch * 2 <= k) || (H[ch * 2 + 1] < H[ch] && ch * 2 + 1 <= k))
{
if (H[ch * 2] < H[ch * 2 + 1] || ch * 2 + 1 > k)
{
interschimba(ch, ch * 2);
coboara(ch * 2);
}
else
{
interschimba(ch, ch * 2 + 1);
coboara(ch * 2 + 1);
}
}
return;
}
void urca(int ch)
{
if (ch > 1 && H[ch / 2] > H[ch])
{
interschimba(ch, ch / 2);
ch = ch / 2;
urca(ch);
}
}
void baga(int x)
{
k++;
n++;
H[k] = x;
key[n] = k;
inv[k] = n;
urca(k);
}
void sterge(int cheie)
{
interschimba(cheie, k);
k--;
urca(cheie);
coboara(cheie);
}
int main()
{
fi >> q;
for (int i = 1; i <= q; i++)
{
int op, x;
fi >> op;
if (op == 1)
{
fi >> x;
baga(x);
}
else if (op == 2)
{
fi >> x;
sterge(key[x]);
}
else
{
fo << H[1] << "\n";
}
}
return 0;
}