Pagini recente » Cod sursa (job #1027526) | Cod sursa (job #1972180) | Cod sursa (job #435167) | Cod sursa (job #820676) | Cod sursa (job #1978701)
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
#include <queue>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
#define pb push_back
#define ll long long
const int NMax = 5e5 + 5;
const int inf = 1e9 + 5;
int M,N,nrInsert;
int idx[NMax];
struct elem {
int val,ord;
elem (int _val = 0,int _ord = 0) {
val = _val;
ord = _ord;
}
} v[NMax];
void sift(int);
void percolate(int);
void swap_heap(elem&,elem&);
int main() {
in>>M;
N = nrInsert = 0;
while (M--) {
int tip,x;
in>>tip;
switch (tip) {
case 1: {
in>>x;
v[++N] = elem(x,++nrInsert);
idx[nrInsert] = N;
percolate(N);
break;
}
case 2: {
in>>x;
int pos = idx[x];
swap_heap(v[pos],v[N]);
N--;
if (pos != 1 && v[pos].val < v[pos/2].val) {
percolate(pos);
}
else {
sift(pos);
}
break;
}
default: {
out<<v[1].val<<'\n';
}
}
/*
for (int i=1;i <= N;++i) {
cout<<i<<' '<<v[i].val<<' '<<v[i].ord<<' '<<idx[i]<<'\n';
}
cout<<'\n';
//*/
}
in.close();out.close();
return 0;
}
void percolate(int node) {
int dad = node/2;
while (node != 1 && v[node].val < v[dad].val) {
swap_heap(v[node],v[dad]);
node = dad;
dad = node/2;
}
}
void sift(int node) {
int son = 0;
do {
son = 0;
int fs = 2*node,
ss = 2*node + 1;
if (fs <= N) {
son = fs;
if (ss <= N && v[ss].val < v[son].val) {
son = ss;
}
}
if (son && v[son].val < v[node].val) {
swap_heap(v[son],v[node]);
node = son;
}
else {
son = 0;
}
}
while (son);
}
void swap_heap(elem &a,elem &b) {
swap(idx[a.ord],idx[b.ord]);
swap(a,b);
}