$Fhq$ $treap$

#include <bits/stdc++.h>
using namespace std;
const int MAXN=100100;
int n,root,t;
struct node
{
int val,key,si,son[2],g;
}sh[MAXN];
deque <int> q;
int newnode(int v)
{
t++;
sh[t].si=sh[t].g=1;
sh[t].val=v;
sh[t].key=rand();
return t;
}
void pushup(int x)
{
sh[x].si=sh[x].g+sh[sh[x].son[0]].si+sh[sh[x].son[1]].si;
}
void split(int now,int k,int &x,int &y)
{
if (now==0)
{
x=y=0;
return;
}
if (sh[now].val<=k)
{
x=now;
split(sh[now].son[1],k,sh[now].son[1],y);
}
else
{
y=now;
split(sh[now].son[0],k,x,sh[now].son[0]);
}
pushup(now);
}
int merge(int x,int y)
{
if (x==0)
return y;
if (y==0)
return x;
if (sh[x].key<sh[y].key)
{
sh[x].son[1]=merge(sh[x].son[1],y);
pushup(x);
return x;
}
else
{
sh[y].son[0]=merge(x,sh[y].son[0]);
pushup(y);
return y;
}
}
int kth(int now,int k)
{
if (sh[sh[now].son[0]].si<k && k<=sh[sh[now].son[0]].si+sh[now].g)
return now;
else
if (k<sh[sh[now].son[0]].si+sh[now].g)
return kth(sh[now].son[0],k);
else
return kth(sh[now].son[1],k-sh[sh[now].son[0]].si-sh[now].g);
}
int find(int x)
{
q.clear();
int cur;
cur=root;
while (sh[cur].son[x>sh[cur].val]!=0 && sh[cur].val!=x)
q.push_back(cur),cur=sh[cur].son[x>sh[cur].val];
q.push_back(cur);
return cur;
}
void updata()
{
while (!q.empty())
{
pushup(q.back());
q.pop_back();
}
}
int main()
{
srand(time(0));
root=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,op;
scanf("%d%d",&op,&x);
if (op==1)
{
int cur=find(x);
if (sh[cur].val==x)
{
sh[cur].g++;
updata();
}
else
{
int a,b;
split(root,x,a,b);
root=merge(merge(a,newnode(x)),b);
}
}
if (op==2)
{
int cur=find(x);
sh[cur].g--;
updata();
if (sh[cur].g==0)
{
int a,b,c;
split(root,x,a,b);
split(a,x-1,a,c);
c=merge(sh[c].son[0],sh[c].son[1]);
root=merge(merge(a,b),c);
}
}
if (op==3)
{
int a,b;
split(root,x-1,a,b);
printf("%d\n",sh[a].si+1);
root=merge(a,b);
}
if (op==4)
{
printf("%d\n",sh[kth(root,x)].val);
}
if (op==5)
{
int a,b;
split(root,x-1,a,b);
printf("%d\n",sh[kth(a,sh[a].si)].val);
root=merge(a,b);
}
if (op==6)
{
int a,b;
split(root,x,a,b);
printf("%d\n",sh[kth(b,1)].val);
root=merge(a,b);
}
}
}

最新文章

  1. React Native知识5-Touchable类组件
  2. SSR———团队作业:小型论坛的设计与初步实现
  3. ubuntu下修改apache2.4的rewrite
  4. 【xml】python的lxml库使用
  5. Dotfuscator可以实现混淆代码、变量名修改、字符串加密
  6. Oracle基础 (十四)其他函数
  7. (转)fastdfs group通过添加硬盘扩容
  8. php对象的高级特性
  9. left ,right ,cross ,full/left outer join/区别 详解
  10. 如何让窗口控件半透明(控件在Paint自己时,首先向主窗口询问,获取主窗口上控件所在区域的背景图)
  11. boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET
  12. (简单) POJ 1860 Currency Exchange,SPFA判圈。
  13. 关于开发环境中的消息在download时没有下载下来时的问题
  14. 看eShopOnContainers学一个EventBus
  15. Cloud Native 云化架构阅读笔记
  16. 架构(二)Maven安装以及Nexus配置
  17. file 文件上传,下载,删除
  18. C# Math.Round实现中国式四舍五入
  19. python之多线程 queue 实践 筛选有效url
  20. 《C++反汇编与逆向分析技术揭秘》之12——继承

热门文章

  1. SQL实战——04. 查找所有已经分配部门的员工的last_name和first_name以及dept_no (一个逗号引发的血案)
  2. 028 01 Android 零基础入门 01 Java基础语法 03 Java运算符 08 逻辑“或”运算符
  3. 【代码审计】PHP代码审计---基础记录
  4. C\C++中计时、延时函数
  5. OpenCV 中Scalar
  6. 使用 .NET 进行游戏开发
  7. 线上服务的FGC问题排查
  8. shell-字符串及整数操作符讲解与多实践
  9. element中过滤器filters的使用(开发小记)
  10. python程序整理(1)