Pagini recente » Cod sursa (job #1034366) | Borderou de evaluare (job #1083037) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #780809)
Cod sursa(job #780809)
#include <cstdio>
#include <algorithm>
using namespace std;
const int kMaxN = 200005;
int N, Value[kMaxN], NH, H[kMaxN], P[kMaxN];
inline bool Compare(const int X, const int Y) {
return Value[X] < Value[Y];
}
inline void Swap(const int X, const int Y) {
swap(P[H[X]], P[H[Y]]);
swap(H[X], H[Y]);
}
void Percolate(const int X)
{
int F = (X>>1);
if (F && Compare(H[X], H[F])) {
Swap(X, F); Percolate(F);
}
}
void Sift(const int X) {
int Son = (X<<1);
Son += (Son+1 <= NH && Compare(H[Son+1], H[Son]));
if (Son <= NH && Compare(H[Son], H[X])) {
Swap(X, Son); Sift(Son);
}
}
inline void Insert(const int X) {
H[++NH] = X, P[X] = NH;
Percolate(P[X]);
}
inline void Erase(const int X) {
Swap(X, NH);
P[H[NH]] = 0, H[NH--] = 0;
Sift(X);
}
int main() {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int M; scanf("%d", &M);
for (; M; --M) {
int Type; scanf("%d", &Type);
if (Type == 1) {
scanf("%d", &Value[++N]);
Insert(N);
}
if (Type == 2) {
int X; scanf("%d", &X);
Erase(P[X]);
}
if (Type == 3)
printf("%d\n", Value[H[1]]);
}
return 0;
}