#ifndef TREAP
#define TREAP
template<typename T>
class treap{
private:
struct node{
T data;
unsigned fix;
int size;
node *ch[2];
node(const T&d):data(d),size(1){}
node():size(0){ch[0]=ch[1]=this;}
}*nil,*root;
unsigned x;
inline unsigned ran(){
return x=x*0xdefaced+1;
}
inline void rotate(node *&a,bool d){
node *b=a;
a=a->ch[!d];
a->size=b->size;
b->ch[!d]=a->ch[d];
a->ch[d]=b;
b->size=b->ch[0]->size+b->ch[1]->size+1;
}
void insert(node *&o,const T &data){
if(!o->size){
o=new node(data),o->fix=ran();
o->ch[0]=o->ch[1]=nil;
}else{
o->size++;
bool d=o->data<data;
insert(o->ch[d],data);
if(o->ch[d]->fix>o->fix)rotate(o,!d);
}
}
bool success_erase(node *&o){
if(!o->ch[0]->size||!o->ch[1]->size){
node *t=o;
o=o->ch[0]->size?o->ch[0]:o->ch[1];
delete t;
}else{
o->size--;
bool d=o->ch[0]->fix>o->ch[1]->fix;
rotate(o,d);
success_erase(o->ch[d]);
}
return 1;
}
bool erase(node *&o,const T &data){
if(!o->size)return 0;
if(o->data==data)return success_erase(o);
if(erase(o->ch[o->data<data],data)){
o->size--;return 1;
}else return 0;
}
void clear(node *&o){
if(o->size)clear(o->ch[0]),clear(o->ch[1]),delete o;
}
public:
treap(unsigned s=20150119):nil(new node),root(nil),x(s){}
~treap(){clear(root),delete nil;}
inline void clear(){clear(root),root=nil;}
inline void insert(const T &data){
insert(root,data);
}
inline bool erase(const T &data){
return erase(root,data);
}
inline bool find(const T&data){
for(node *o=root;o->size;)
if(o->data==data)return 1;
else o=o->ch[o->data<data];
return 0;
}
inline int rank(const T&data){
int cnt=0;
for(node *o=root;o->size;)
if(o->data<data)cnt+=o->ch[0]->size+1,o=o->ch[1];
else o=o->ch[0];
return cnt;
}
inline const T&kth(int k){
for(node *o=root;;)
if(k<=o->ch[0]->size)o=o->ch[0];
else if(k==o->ch[0]->size+1)return o->data;
else k-=o->ch[0]->size+1,o=o->ch[1];
}
inline const T&operator[](int k){
return kth(k);
}
inline const T&preorder(const T&data){
node *x=root,*y=0;
while(x->size)
if(x->data<data)y=x,x=x->ch[1];
else x=x->ch[0];
if(y)return y->data;
return data;
}
inline const T&successor(const T&data){
node *x=root,*y=0;
while(x->size)
if(data<x->data)y=x,x=x->ch[0];
else x=x->ch[1];
if(y)return y->data;
return data;
}
inline int size(){return root->size;}
};
#endif
Treap
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扭屁,“玉大人算谈,你說我怎么就攤上這事×侠模” “怎么了然眼?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長幔欧。 經(jīng)常有香客問我罪治,道長丽声,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任觉义,我火速辦了婚禮雁社,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晒骇。我一直安慰自己霉撵,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布洪囤。 她就那樣靜靜地躺著徒坡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘤缩。 梳的紋絲不亂的頭發(fā)上喇完,一...
- 文/蒼蘭香墨 我猛地睜開眼牺丙,長吁一口氣:“原來是場噩夢啊……” “哼则涯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冲簿,我...
- 序言:老撾萬榮一對情侶失蹤粟判,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后峦剔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浮入,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年羊异,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彤断。...
- 正文 年R本政府宣布供炼,位于F島的核電站一屋,受9級特大地震影響窘疮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冀墨,卻給世界環(huán)境...
- 文/蒙蒙 一闸衫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诽嘉,春花似錦蔚出、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悦冀,卻和暖如春趋翻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盒蟆。 一陣腳步聲響...
- 正文 我出身青樓宙帝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親募闲。 傳聞我的和親對象是個(gè)殘疾皇子步脓,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 《小白學(xué)前端》系列博客是根據(jù)騰訊課堂IMWeb前端小白訓(xùn)練營每天任務(wù)的內(nèi)容加以整理而成。 任務(wù)一:W3SCHOOL...