Pagini recente » Cod sursa (job #628042) | Cod sursa (job #2042890) | Cod sursa (job #1765735) | Cod sursa (job #1448789) | Cod sursa (job #1507666)
#include <bits/stdc++.h>
using namespace std;
struct node {
int key, l, r, priority, minv, val;
};
node T[200005];
int root, nodes;
void update(int x) {
int minv = T[x].val;
minv = min(minv, T[T[x].l].minv);
minv = min(minv, T[T[x].r].minv);
T[x].minv = minv;
}
void split(int x, int key, int &left, int &right) {
if(x == 0) left = right = 0;
else if(key < T[x].key) split(T[x].l, key, left, T[x].l), right = x;
else split(T[x].r, key, T[x].r, right), left = x;
update(x);
}
void join(int &x, int left, int right) {
if(left == 0 || right == 0)
x = (left) ? left : right;
else if(T[left].priority > T[right].priority) {
join(T[left].r, T[left].r, right);
x = left;
} else {
join(T[right].l, left, T[right].l);
x = right;
}
update(x);
}
void add(int &x, int what) {
if(x == 0) x = what;
else if(T[what].priority <= T[x].priority)
add((T[what].key < T[x].key) ? T[x].l : T[x].r, what);
else {
split(x, T[what].key, T[what].l, T[what].r);
x = what;
}
update(x);
}
void ins(int key, int value) {
++nodes;
T[nodes].key = key;
T[nodes].priority = rand();
T[nodes].val = T[nodes].minv = value;
T[nodes].l = T[nodes].r = 0;
add(root, nodes);
}
void ers(int &x, int key) {
if(T[x].key == key) join(x, T[x].l, T[x].r);
else ers((key < T[x].key) ? T[x].l : T[x].r, key);
update(x);
}
int main() {
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
T[0].val = T[0].minv = 1000000005;
int n, t, a, timer = 0;
fin>>n;
while(n--) {
fin>>t;
if(t == 3) fout<<T[root].minv<<'\n';
else {
fin>>a;
if(t == 1) ins(++timer, a);
else ers(root, a);
}
}
return 0;
}