Pagini recente » Cod sursa (job #755169) | Cod sursa (job #3166165) | Cod sursa (job #2110572) | Cod sursa (job #2352149) | Cod sursa (job #1747590)
#include <bits/stdc++.h>
using namespace std;
struct item{
int key, prior;
item * l, * r;
item(){}
item(int key) : key(key), prior((rand() << 16) ^ rand()), l(NULL), r(NULL) {}
};
using pitem = item*;
pitem root;
void split(pitem t, int x, pitem& l, pitem& r)
{
if (!t)
l = r = NULL;
else if (x > t->key)
split(t->r, x, t->r, r), l = t;
else
split(t->l, x,l, t->l), r = t;
}
void merge(pitem& t, pitem l, pitem r)
{
if (!l || !r)
t = l ? l : r;
else if (l->prior > r->prior)
merge(l->r, l->r, r), t = l;
else
merge(r->l, l, r->l), t = r;
}
int find(pitem t, int key)
{
if (!t) return 0;
if (t->key == key)
return 1;
return find(key <= t->key ? t->l : t->r, key);
}
void insert(pitem& t, pitem it)
{
if (!t)
t = it;
else if (it->prior > t->prior)
split(t, it->key, it->l, it->r), t = it;
else
insert(it->key <= t->key ? t->l : t->r, it);
}
void erase(pitem& t, int key)
{
if (t->key == key)
merge(t, t->l, t->r);
else
erase(key < t->key ? t->l : t->r, key);
}
int MIN()
{
pitem t=root;
while(t->l) t=t->l;
return t->key;
}
int el[200200];
int el_count;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int main()
{
int t;
fin>>t;
while(t--)
{
int tip;
fin>>tip;
if (tip==1){int val;fin>>val; insert(root,new item(val)); el[++el_count] = val;}
if (tip==2){int ps; fin>>ps; erase(root,el[ps]);}
if (tip==3){fout<<MIN()<<'\n';}
}
}