记录编号 432119 评测结果 AAAAAAAAAA
题目名称 [Tyvj 1728]普通平衡树 最终得分 100
用户昵称 Gravatarhunter 是否通过 通过
代码语言 C++ 运行时间 0.734 s
提交时间 2017-08-02 20:47:46 内存使用 7.94 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn  1000005
const int INF=1<<30;
using namespace std;
struct node
{
     int sz,v;
     node *fa,*ch[2];
     node(int v=0):v(v){sz=1;fa=ch[0]=ch[1]=NULL;}
     inline int cmp(int x) { return x==v ? -1 : x>v ; }
     inline void up(){
        sz=1;
        if(ch[0]!=NULL) sz+=ch[0]->sz;
        if(ch[1]!=NULL) sz+=ch[1]->sz;
     }
}*nod[maxn*2];
int top=0,n;
inline void init(){
   for(int i=0;i<maxn;i++) nod[i]=new node();
}
inline void del(node* &p) {nod[--top]=p;p=NULL;}
inline void newnode(node* &p,int v,node* fa)
{
     p=nod[top++];
     *p=node(v);
     p->fa=fa;
}
node *root; 
struct splaytree
{
      inline int pd(node* p){return p->fa->ch[1]==p;}
      void rotate(node *p)
      {
           int c=pd(p)^1;
           node *t=p->fa;
           t->ch[c^1]=p->ch[c];
           if(p->ch[c]) p->ch[c]->fa=t;
           if((p->fa=t->fa)!=NULL) p->fa->ch[p->fa->ch[1]==t]=p;
           t->fa=p;
           p->ch[c]=t;
           t->up();
           p->up();
           if(p->fa==NULL) root=p;
      }
      void splay(node* p,node* target)
      {
          for(;p->fa!=target;rotate(p))
            if(p->fa->fa!=target) rotate(pd(p)==pd(p->fa)?p->fa:p);
      }
      void insert(node* p,int val)
      {
           if(root==NULL){newnode(root,val,NULL);return ;}
           node *fa=NULL;
           while(p!=NULL){
               fa=p;
               p=p->ch[val>p->v];               
           }
           newnode(p,val,fa);
           fa->ch[val>fa->v]=p;
           for(fa=p->fa;fa!=NULL;fa=fa->fa) fa->up();
           splay(p,NULL);
      }
      node* find(node* p,int val)
      {
            while(p!=NULL){
                int tmp=p->cmp(val);
                if(tmp==-1) return p;
                p=p->ch[tmp];
            }
            return NULL;
      }
      node* Max(node* p){
         if(p==NULL) return NULL;
         while(p->ch[1]!=NULL) p=p->ch[1];
         return p;
      }
      node* merge(node* a,node* b)
      {
            if(!b) return a;
            if(!a) return b;
            node *t=Max(a);
            splay(t,NULL);
            t->ch[1]=b;
            b->fa=t;
            t->up();
            return t; 
      }
      void remove(node* p,int val)
      {
          node* pos=find(root,val);
          splay(pos,NULL);
          pos=root;
          del(root);
          root=merge(pos->ch[0],pos->ch[1]);
          if(root!=NULL) root->fa=NULL;
      }
      int rank(node* p,int val)
      {
          int ret=1;
          while(p!=NULL){
             int tmp=val>p->v,d=p->ch[0]?p->ch[0]->sz:0;
             if(tmp) ret+=d+1;
             p=p->ch[tmp];
          }
          return ret;
      }
      int kth(node* p,int k)
      {
          while(p!=NULL){
             int d=p->ch[0]?p->ch[0]->sz:0;
             if(k==d+1) return p->v;
             if(k<d+1) p=p->ch[0];
             else{
                k-=d+1;
                p=p->ch[1];
             }
          }
          return -1;
      }
      int Pre(node* p,int val)
      {
          int ret=-INF;
          while(p!=NULL){
             int tmp=val> p->v;
             if(tmp) ret=max(ret,p->v);
             p=p->ch[tmp];
          }
          return ret;
      }
      int Sub(node *p,int val)
      {
          int ret=INF;
          while(p!=NULL){
             int tmp=val< p->v;
             if(tmp) ret=min(ret,p->v);
             p=p->ch[tmp^1];
          }
          return ret;
      }
}sp;
char s[25];
int main()
{
    freopen("phs.in","r",stdin);
    freopen("phs.out","w",stdout);
    int op,x;
    int n;
    scanf("%d",&n);init();
    while(n--){
        scanf("%d%d",&op,&x);
        if(op==1) sp.insert(root,x);
        if(op==2) sp.remove(root,x);
        if(op==3) printf("%d\n",sp.rank(root,x));
        if(op==4) printf("%d\n",sp.kth(root,x));
        if(op==5) printf("%d\n",sp.Pre(root,x));
        if(op==6) printf("%d\n",sp.Sub(root,x)); 
    }
    //while(1);
    return 0;
}