Pagini recente » Cod sursa (job #998430) | Cod sursa (job #838158) | Cod sursa (job #2224659) | Cod sursa (job #538869) | Cod sursa (job #2896489)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int Nmax = 2e5 + 5;
int T, c, x, N, v;
int A[Nmax], H[Nmax], poz[Nmax];
void Percolate(int node)
{
while(node > 0 && A[H[node / 2]] > A[H[node]])
{
swap(H[node], H[node / 2]);
swap(poz[H[node]], poz[H[node / 2]]);
node /= 2;
}
}
void Sift(int node)
{
while(node <= N)
{
int Min = node, left = 2 * node, right = 2 * node + 1;
if (left <= N && A[H[left]] < A[H[Min]])
Min = left;
if (right <= N && A[H[right]] < A[H[Min]])
Min = right;
if (Min == node)
break;
swap(H[node], H[Min]);
swap(poz[H[node]], poz[H[Min]]);
node = Min;
}
}
void Add(int x)
{
A[++v] = x;
H[++N] = v;
poz[v] = N;
Percolate(N);
}
void Delete(int node)
{
if (node == N)
N--;
else
{
swap(H[node], H[N]);
swap(poz[H[node]], poz[H[N]]);
N--;
Sift(node);
Percolate(node);
}
}
int main()
{
in >> T;
while(T--)
{
in >> c;
if (c == 1)
{
in >> x;
Add(x);
}
else if (c == 2)
{
in >> x;
Delete(poz[x]);
}
else if (c == 3)
out << A[H[1]] << '\n';
}
return 0;
}