class Treap
{
public:
inline void Treap_insert(int ins_data)
{
treap_insert(root,ins_data);
}
inline void Treap_delete(int del_data)
{
treap_delete(root,del_data);
}
inline int Treap_find_data(int pos_data)
{
return treap_find_data(root,pos_data);
}
inline int Treap_find_id(int pos_id)
{
return treap_find_id(root,pos_id);
}
inline int Treap_find_pre(int pos_xx)
{
return treap_find_pre(root,pos_xx);
}
inline int Treap_find_next(int pos_xx)
{
return treap_find_next(root,pos_xx);
}
private:
struct STU{int r,siz,pri,data,l;};
vector<STU>treap;
int root,tot;
inline void treap_updata(int x_now)
{
treap[x_now].siz=treap[treap[x_now].l].siz+treap[treap[x_now].r].siz+1;
}
inline int treap_add(int data)
{
if(tot==0)treap.push_back((STU){0,0,0,0,0});
treap.push_back((STU){0,1,rand(),data,0});
return ++tot;
}
inline void treap_split(int x_now,int &x_left,int &x_right,int data)
{
if(x_now==0){x_left=x_right=0;return;}
if(treap[x_now].data<=data)
{
x_left=x_now;
treap_split(treap[x_now].r,treap[x_now].r,x_right,data);
}
else
{
x_right=x_now;
treap_split(treap[x_now].l,x_left,treap[x_now].l,data);
}
treap_updata(x_now);
}
inline void treap_merge(int &x_now,int x_left,int x_right)
{
if(!x_left||!x_right){x_now=x_left+x_right;return;}
if(treap[x_left].pri<treap[x_right].pri)
{
x_now=x_left;
treap_merge(treap[x_left].r,treap[x_left].r,x_right);
}
else
{
x_now=x_right;
treap_merge(treap[x_right].l,x_left,treap[x_right].l);
}
treap_updata(x_now);
}
inline void treap_insert(int &x_now,int data)
{
int x_left=0,x_right=0,x_ins=treap_add(data);
treap_split(x_now,x_left,x_right,data);
treap_merge(x_left,x_left,x_ins);
treap_merge(x_now,x_left,x_right);
}
inline void treap_delete(int &x_now,int data)
{
int x_left=0,x_right=0,x_del=0;
treap_split(x_now,x_left,x_right,data);
treap_split(x_left,x_left,x_del,data-1);
treap_merge(x_del,treap[x_del].l,treap[x_del].r);
treap_merge(x_left,x_left,x_del);
treap_merge(x_now,x_left,x_right);
}
inline int treap_find_data(int x_now,int data)
{
while(treap[treap[x_now].l].siz+1!=data)
if(treap[treap[x_now].l].siz>=data)x_now=treap[x_now].l;
else data-=treap[treap[x_now].l].siz+1,x_now=treap[x_now].r;
return treap[x_now].data;
}
inline int treap_find_id(int &x_now,int data)
{
int x_left=0,x_right=0,x_pos=0;
treap_split(x_now,x_left,x_right,data-1);
x_pos=treap[x_left].siz+1;
treap_merge(x_now,x_left,x_right);
return x_pos;
}
inline int treap_find_pre(int &x_now,int data)
{
int x_left=0,x_right=0,x_data=0;
treap_split(x_now,x_left,x_right,data-1);
if(treap[x_left].siz==0)x_data=INT_MIN;
else x_data=treap_find_data(x_left,treap[x_left].siz);
treap_merge(x_now,x_left,x_right);
return x_data;
}
inline int treap_find_next(int &x_now,int data)
{
int x_left=0,x_right=0,x_data=0;
treap_split(x_now,x_left,x_right,data);
if(treap[x_right].siz==0)x_data=INT_MAX;
else x_data=treap_find_data(x_right,1);
treap_merge(x_now,x_left,x_right);
return x_data;
}
};
怎么像sort一样传入一个cmp?怎么把treap的元素换成外部自定义的struct?蒟蒻求助DALAO