Heap
Jump to navigation
Jump to search
Leftist Tree (Persistent)
namespace LTree {
extern struct P* null, *pit;
queue<P*> trash;
const int M = 1E6 + 100;
struct P {
P *ls, *rs;
LL v;
int d;
void operator delete (void* ptr) {
trash.push((P*)ptr);
}
void* operator new(size_t size) {
if (trash.empty()) return pit++;
void* ret = trash.front(); trash.pop(); return ret;
}
} pool[M], *pit = pool, *null = new P{0, 0, -1, -1};
P* N(LL v, P* ls = null, P* rs = null) {
if (ls->d < rs->d) swap(ls, rs);
return new P{ls, rs, v, rs->d + 1};
}
P* merge(P* a, P* b) {
if (a == null) return b;
if (b == null) return a;
if (a->v < b->v) return N(a->v, a->ls, merge(a->rs, b));
else return N(b->v, b->ls, merge(b->rs, a));
}
LL pop(P*& o) {
LL ret = o->v;
o = merge(o->ls, o->rs);
return ret;
}
}