#include<cstdio>
#include<ctime>
#include<cstdlib>
struct shu
{
 int l,r,sum1,zhi,dui,sum2;
}a[100006];
int n,root,size,ans;
void you(int &a1)
{
 int t=a[a1].l;
 a[a1].l=a[t].r;
 a[t].r=a1;
 a[t].sum1=a[a1].sum1;
 a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
 a1=t;
 return;
}
void zuo(int &a1)
{
 int t=a[a1].r;
 a[a1].r=a[t].l;
 a[t].l=a1;
 a[t].sum1=a[a1].sum1;
 a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
 a1=t;
 return;
}
void cha(int &a1,int a2)
{
 if(a1==0)
   {
    size++;
    a1=size;
    a[a1].sum1=1;
    a[a1].sum2=1;
    a[a1].zhi=a2;
    a[a1].dui=rand();
    return;
   }
 a[a1].sum1++;
 if(a[a1].zhi==a2)
   {
   a[a1].sum2++;
      return;
   }
 if(a2<a[a1].zhi)
   {
    cha(a[a1].l,a2);
    if(a[a[a1].l].dui<a[a1].dui)
      you(a1);
   }
 else
   {
    cha(a[a1].r,a2);
    if(a[a[a1].r].dui<a[a1].dui)
      zuo(a1);
   }
}
void shan(int &a1,int a2)
{
 if(a1==0)
   return;
 if(a[a1].zhi==a2)
 {
  if(a[a1].sum2>1)
   {
    a[a1].sum2--;
    a[a1].sum1--;
      }
  else if(a[a1].l*a[a1].r==0)
         a1=a[a1].l+a[a1].r;
       else if(a[a[a1].l].dui<a[a[a1].r].dui)
              {
                you(a1);
                shan(a1,a2);
              }
            else
              {
                zuo(a1);
                shan(a1,a2);
     }
  return;
 }
 a[a1].sum1--;
 if(a[a1].zhi<a2)
   shan(a[a1].r,a2);
 else
   shan(a[a1].l,a2);
 return;
}
int cha1(int a1,int a2)
{
 if(a1==0)
   return 0;
 if(a[a1].zhi==a2)
   return a[a[a1].l].sum1+1;
 if(a[a1].zhi>a2)
   return cha1(a[a1].l,a2);
   return a[a[a1].l].sum1+a[a1].sum2+cha1(a[a1].r,a2); 
}
int cha2(int a1,int a2)
{
 if(a1==0)
   return 0;
 if(a[a[a1].l].sum1>=a2)
   return cha2(a[a1].l,a2);
 if(a[a[a1].l].sum1+a[a1].sum2>=a2)
   return a[a1].zhi;
 return cha2(a[a1].r,a2-a[a[a1].l].sum1-a[a1].sum2);
}
void qian(int a1,int a2)
{
 if(a1==0)
   return;
 if(a[a1].zhi<a2)
   {
    ans=a[a1].zhi;
    qian(a[a1].r,a2);
   }
 else
   qian(a[a1].l,a2);
 return;
}
void hou(int a1,int a2)
{
 if(a1==0)
   return;
 if(a[a1].zhi>a2)
   {
    ans=a[a1].zhi;
    hou(a[a1].l,a2);
   }
 else
   hou(a[a1].r,a2);
 return;
}
int main()
{
 srand(time(0));
 scanf("%d",&n);
 for(int i=0;i<n;i++)
   {
    int a1,a2;
    scanf("%d%d",&a1,&a2);
    if(a1==1)
      cha(root,a2);
    if(a1==2)
      shan(root,a2);
    if(a1==3)
      printf("%d\n",cha1(root,a2));
    if(a1==4)
      printf("%d\n",cha2(root,a2));
    if(a1==5)
      {
       ans=0;
       qian(root,a2);
        printf("%d\n",ans);
      }
    if(a1==6)
      {
       ans=0;
       hou(root,a2);
       printf("%d\n",ans);
   }
   }
   return 0;
}

treap codevs 4543普通平衡树的更多相关文章

  1. codevs 4543 treap 模板

    type rec=record lc,rc,v,rnd,size,w,fa:longint; end; var n,root,tot,ans,opt,x,i,po:longint; tr:array[ ...

  2. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  3. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  4. HDU 4585 平衡树Treap

    点击打开链接 题意:给出n组数,第一个数是id.第二个数是级别.每输入一个.输出这个人和哪个人打架,这个人会找和他级别最相近的人打,假设有两个人级别和他相差的一样多,他就会选择级别比他小的打架. 思路 ...

  5. c++之路进阶——codevs4543(普通平衡树)

    4543 普通平衡树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description 这是一道水题 顺便祝愿LEZ和ZQQ 省 ...

  6. 【BZOJ3224】【tyvj1728】普通平衡树

    最近开始学习平衡树,在学长的强烈推荐下学习了AVL.红黑树.splay(以上我都还没学)treap. 首先讲一下个人对treap(树堆)的理解. treap,顾名思义,就是tree+heap,首先因为 ...

  7. 旋转/非旋转treap的简单操作

    treap(树堆) 是在二叉搜索树的基础上,通过维护随机附加域,使其满足堆性质,从而使树相对平衡的二叉树: 为什么可以这样呢? 因为在维护堆的时候可以同时保证搜索树的性质: (比如当一棵树的一个域满足 ...

  8. bzoj 2770 YY的Treap

    Written with StackEdit. Description 志向远大的\(YY\)小朋友在学完快速排序之后决定学习平衡树,左思右想再加上\(SY\)的教唆,\(YY\)决定学习\(Trea ...

  9. 【BZOJ2770】YY的Treap 结论+线段树

    [BZOJ2770]YY的Treap Description 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了Y ...

随机推荐

  1. GooglePlay_下载apk

    关键字:"APK Downloader" 方式: (1)."APK Downloader"网站在线下载(无需我们的GooglePlay账户信息,也就无需Goog ...

  2. python中的实例方法、静态方法、类方法、类变量和实例变量

    class MyTest: myname = 'peter' # add a instance attribute    def __init__(self, name):        self.n ...

  3. Git的优势

    分布式,强调个体 公共服务器压力和数据量都不会太大 速度快.灵活 任意两个开发者之间可以很容易的解决冲突 离线工作

  4. openfire过滤脏话插件,控制消息是否发送

    参考:http://myopenfire.com/article/getarticle/9 package com.myopenfire.plugin; import java.io.File; im ...

  5. linux runlevel

    Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多 ...

  6. xcode使用

    1xcode模拟器插件路径 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 2调试 Po值: nil就是0,而不是空值 小细 ...

  7. Hbase之缓存扫描加快读取速度

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...

  8. easyui datagrid 设置列宽

    <script>        $(document).ready(function () {            alert("sdf");            ...

  9. Windows菜单

    目录 第1章 Windows菜单    1 1.1 窗口菜单和弹出菜单    1 1.2 使用SetMenu    2 1.3 使用TrackPopupMenu    4 第1章 Windows菜单 ...

  10. hdu 2102

    简单的3维BFS 大写的YES和NO,这心粗的....唉 #include<iostream> #include<cstdio> #include<queue> u ...