Pagini recente » Cod sursa (job #760451) | Cod sursa (job #2722875) | Cod sursa (job #935597) | Cod sursa (job #1530459) | Cod sursa (job #2204711)
#include <bits/stdc++.h>
using namespace std;
#define FILE_IO
class PairingHeap
{
public:
struct H
{
int val = 0;
int id = 0;
vector<H*> nxt;
H() { ; }
H(int _val, int _id) { val = _val, id = _id; }
};
H *R;
vector<H*> pts;
int N = 0;
int getMin()
{
if(R == 0) return -1;
return R -> val;
}
void deleteMin()
{
if(R == 0) return;
erase(R);
}
H* joinPairs(vector<H*> v)
{
vector<H*> newv;
for(int i = 0; i < v.size(); i += 2)
{
if(i + 1 < v.size()) newv.push_back(join(v[i], v[i + 1]));
else newv.push_back(v[i]);
}
H* nd = 0;
for(int i = int(newv.size()) - 1; i >= 0; i--)
nd = join(nd, newv[i]);
return nd;
}
void swapH(H *&a, H *&b)
{
swap(a -> val, b -> val);
swap(a -> id, b -> id);
swap(a -> nxt, b -> nxt);
}
void cloneH(H *&a, H *&b)
{
if(b == 0 || b -> id == -1)
{
a -> id = -1;
a = 0;
//pts[a -> id] = 0;
//delete a;
b = 0;
return;
}
a -> val = b -> val;
a -> id = b -> id;
a -> nxt = b -> nxt;
pts[a -> id] = a;
//delete b;
b -> id = -1;
b = 0;
}
H* join(H *&a, H *&b)
{
if(a == 0) return b;
if(b == 0) return a;
if(a -> id == -1) { a = 0; return b; }
if(b -> id == -1) { b = 0; return a; }
if(a -> val > b -> val)
swapH(a, b);
a -> nxt.push_back(b);
pts[a -> id] = a;
pts[b -> id] = b;
return a;
}
void erase(H *&a)
{
if(a == 0) return;
vector<H*> nxt = a -> nxt;
H *b = joinPairs(nxt);
cloneH(a, b);
}
void insert(int x)
{
H *nd = new H(x, N);
N++;
pts.push_back(nd);
R = join(R, nd);
}
void erase(int id)
{
erase(pts[id]);
}
PairingHeap() { ; }
};
PairingHeap hp;
int main()
{
#ifdef FILE_IO
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
#endif
int Q;
scanf("%d", &Q);
for(int q = 1; q <= Q; q++)
{
int op;
scanf("%d", &op);
if(op == 1)
{
int x;
scanf("%d", &x);
hp.insert(x);
}
else if(op == 2)
{
int x;
scanf("%d", &x);
hp.erase(x - 1);
}
else if(op == 3)
{
int x = hp.getMin();
printf("%d\n", x);
}
}
return 0;
}