[怎么总是忘啊!]treap插入、删除、查找

//treap 7.30

#include<stdio.h>

#include<stdlib.h>

#define mmm 1000000

struct ss

{

       int left,right,key,data,count,size;

} t[mmm+1];

int n,x,y,tot,tott,root;

int b[mmm+1];



void modify(int x)

{

     t[x].size=t[t[x].left].size+t[x].count+t[t[x].right].size;

}



void leftrotate(int *x)

{

     int te=t[*x].left;

     t[*x].left=t[te].right;

     t[te].right=*x;

     modify(*x); *x=te; modify(*x);

}



void rightrotate(int *x)

{

     int te=t[*x].right;

     t[*x].right=t[te].left;

     t[te].left=*x;

     modify(*x); *x=te; modify(*x);

}



void insert(int *x,int y)

{

     if (*x==0)

     {

               *x=++tot;

               t[*x].left=0; t[*x].right=0; 

               t[*x].size=1; t[*x].count=1; 

               t[*x].key=rand()%mmm; t[*x].data=y; 

     }

     else

     {

         if (y==t[*x].data) ++t[*x].count;

         else

         if (y<t[*x].data)

         {

                          insert(&t[*x].left,y);

                          if (t[t[*x].left].key<t[*x].key)

                             leftrotate(x);

         }

         else

         {

             insert(&t[*x].right,y);

             if (t[t[*x].right].key<t[*x].key)

                rightrotate(x);

         }

         modify(*x);

     }

}



void delete_(int *x,int y)

{

     if (*x==0) return;

     if (y<t[*x].data) delete_(&t[*x].left,y);

     else

     if (y>t[*x].data) delete_(&t[*x].right,y);

     else

     {

         if (t[*x].count>1) --t[*x].count;

         else

         if (t[*x].left==0) *x=t[*x].right;

         else

         if (t[*x].right==0) *x=t[*x].left;

         else

         if (t[t[*x].left].key<t[t[*x].right].key)

         {

                                         leftrotate(x);

                                         delete_(&t[*x].right,y);

         }

         else

         {

             rightrotate(x);

             delete_(&t[*x].left,y);

         }

     }

     if (*x!=0) modify(*x);

}



int findkth(int x,int y)

{

    if (y<=t[t[x].left].size) return findkth(t[x].left,y); else

    if (y<=t[t[x].left].size+t[x].count) return t[x].data; else

    return findkth(t[x].right,y-t[t[x].left].size-t[x].count);

}



int main()

{

    freopen("shop.in","r",stdin);

    freopen("shop.out","w",stdout);

    

    scanf("%d",&n);

    srand(n);

    

    for (int i=1;i<=n;++i)

    {

        scanf("%d%d",&x,&y);

        if (x==1){

                  insert(&root,y);

                  b[++tott]=y;

                  } else

        if (x==2) printf("%d\n",b[y]); else

        printf("%d\n",findkth(root,y));

    }

    

    //while (1);

    return 0;

}

你可能感兴趣的:(删除)