SplayTree
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef int Int struct Node{ int size,padir,reverse; }; struct Stack{ int top; Stack():top(0){} Node * node[maxn]; Node * operator [](const int i)const{ return node[i]; } }stack; void Clear(Node * &root){ root=nil; root->size=0; } Node * CreatNode(){ Node * node=new Node(); node->padir=2; node->size=1; node->reverse=0; node->pa=node->chi[0]->chi[1]=nil; return node; } void Update(Node * node){ node->size=node->chi[0]->size+1+node->chi[1]->size; } void Pushdown(Node * node){ if(node->reverse){ Swap(node->chi[0],node->chi[1]); // include padir node->chi[0]->reverse^=1; node->chi[1]->reverse^=1; node->reverse=0; } } void Rotate(Node * node){ ... Update(node); } void Splay(Node * node){ stack.top=0; for(Node * o=node;o!=nil;o=o->pa) stack[stack.top++]=o; for(int i=stack.top-1;i>=0;i--) Pushdown(stack[i]); while(node!=root){ Node *pa=x->pa; if(node->padir^pa->padir) Rotate(pa,pa->padir); else Rotate(pa->pa,pa->dir); if(node==root) break; Rotate(node,node->padir^1); } Update(node); } Node * Search(Node * node,int rank){ while(1){ Pushdown(node); if(node->chi[0]->size+1==rank) return node; if(rank<=node->chi[0]->size) node=node->chi[0]; else{ rank-=node->chi[0]->size+1; node=node->chi[1]; } } } void Split(Node * &root,Node * &node,int rank){ Splay(node=Search(root,rank+1)); root=node->chi[0]; root->padir=2; node->chi[0]=nil; Update(node); } void Split(Node * &root,Node * &lhd,Node * &rhd,int lst,int rst) { Split(root,rhd,rst); Split(root,lhd,lst); } void Merge(Node * &root,Node * node) { Splay(root=Search(root,root->size)); Connect(root,node,1); Update(root); } void Merge(Node * &root,Node * x,Node * y) { Merge(x,y); Merge(root,x); } int GetRank(Node * node){ Splay(node); root=node; return node->chi[0]->size+1; } void Reverse(int lst,int rst){ Node * x,y; Split(root,x,y,lst,rst+1); x.reverse^=1; Merge(root,x,y); } /*void Splay(Node * &node,Int key){ int dir=(key==node->key)?0:(key<node->key?-1:1); if(d==1) key-= }*/ int main(){ return 0; }