#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 80010
#define which(x) (ls[fa[(x)]]==(x))
using namespace std;
int id[N],pos[N],sz[N],ls[N],rs[N],fa[N],tot,n,m,root,a[N];
char op[];
void pushup(int x) {sz[x]=+sz[ls[x]]+sz[rs[x]];}
int Build(int l,int r,int pre)
{
if (l>r) return ;
int mid=l+r>>,u=a[mid];
ls[u]=Build(l,mid-,u);
rs[u]=Build(mid+,r,u);
fa[u]=pre;
pushup(u);
return u;
}
void Rotate(int u){
int v = fa[u], w = fa[v], b = which(u) ? rs[u] : ls[u];
if(w) which(v) ? ls[w] = u : rs[w] = u;
which(u) ? (ls[v] = b, rs[u] = v) : (rs[v] = b, ls[u] = v);
fa[u] = w, fa[v] = u;
if(b) fa[b] = v;
pushup(v), pushup(u);
}
void Splay(int u, int tar){
while(fa[u] != tar){
if(fa[fa[u]] != tar){
if(which(u) == which(fa[u])) Rotate(fa[u]);
else Rotate(u);
}
Rotate(u);
}
if(!tar) root = u;
}
int getrank(int u)
{
Splay(u,);
return sz[ls[u]];
}
int getkth(int k)
{
int cur=root;
while (sz[ls[cur]]+!=k)
{
if (k<=sz[ls[cur]]) cur=ls[cur];
else k-=sz[ls[cur]]+,cur=rs[cur];
}
return cur;
}
void insert(int v,int top)
{
int u=root;
while (top?ls[u]:rs[u])
u=top?ls[u]:rs[u];
fa[v]=u,top?ls[u]=v:rs[u]=v,sz[v]=;
ls[v]=rs[v]=;
Splay(v,);
}
void erase(int u)
{
Splay(u,);
if (sz[u]==) root;
else if (!ls[u] || !rs[u]) root=ls[u]+rs[u],fa[root]=;
else
{
fa[ls[u]]=;
int v=ls[u];
while (rs[v]) v=rs[v];
Splay(v,);
rs[v]=rs[u],fa[rs[u]]=v,pushup(v);
}
}
void swp(int u,int x)
{
Splay(u,);
int v=x<?ls[u]:rs[u];
while (x<?rs[v]:ls[v]) v=x<=?rs[v]:ls[v];
Splay(v,u);
if (x<) swap(rs[u],rs[v]),ls[u]=ls[v],ls[v]=u;
else swap(ls[u],ls[v]),rs[u]=rs[v],rs[v]=u;
fa[v]=,fa[ls[u]]=fa[rs[u]]=u,fa[ls[v]]=fa[rs[v]]=v;
pushup(u),pushup(v);
root=v;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=,x;i<=n;i++)
scanf("%d",&a[i]);
root=Build(,n,);
for (int i=,t,x;i<=m;i++)
{
scanf("%s%d",op,&x);
if (op[]=='T') erase(x),insert(x,);
if (op[]=='B') erase(x),insert(x,);
if (op[]=='A') printf("%d\n",getrank(x));
if (op[]=='Q') printf("%d\n",getkth(x));
if (op[]=='I')
{
scanf("%d",&t);
if (t) swp(x,t);
}
}
return ;
}

BZOJ 1861: [Zjoi2006]Book 书架 | SPlay 板题的更多相关文章

  1. BZOJ 1861: [Zjoi2006]Book 书架 splay

    1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...

  2. BZOJ 1861 [Zjoi2006]Book 书架 ——Splay

    [题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cma ...

  3. BZOJ 1861: [Zjoi2006]Book 书架 (splay)

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1453  Solved: 822[Submit][Stat ...

  4. BZOJ 1861: [Zjoi2006]Book 书架

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1290  Solved: 740[Submit][Stat ...

  5. bzoj1861 [Zjoi2006]Book 书架——splay

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... ...

  6. BZOJ 4522: [Cqoi2016]密钥破解 (Pollard-Rho板题)

    Pollard-Rho 模板 板题-没啥说的- 求逆元出来后如果是负的记得加回正数 CODE #include<bits/stdc++.h> using namespace std; ty ...

  7. [bzoj 1861][zjoi2006] 书架

    传送门 Description 1. Top S--表示把编号为S的书放在最上面. 2. Bottom S--表示把编号为S的书放在最下面. 3. Insert S T--T∈{-1,0,1},若编号 ...

  8. bzoj1861 [Zjoi2006]Book 书架 splay

    小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引 ...

  9. BZOJ[NOI2004]郁闷的出纳员 | Splay板子题

    题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ...

随机推荐

  1. springMVC 面试题整理

    1. springMVC怎么样把某个请求映射到特定的方法上面? 答:直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径. 2. @RequestMapping注解 ...

  2. PHP 基础知识总结

    PHP 代表 PHP: Hypertext Preprocessor PHP 文件可包含文本.HTML.JavaScript代码和 PHP 代码 PHP 代码在服务器上执行,结果以纯 HTML 形式返 ...

  3. nginx+php整合(是让nginx可以运行php,以及下载地址)

    下载地址: nginx:http://nginx.org/en/download.html PHP: https://windows.php.net/download/ 都是官网的自己选择版本 安装文 ...

  4. 在Ubuntu下安装gcc编译器+测试

    1.输入命令: sudo apt-get install gcc libc6-dev 2.创建文件hello.c使用命令: touch hello.c 3.在hello.c中写入:  #include ...

  5. UIView控件 概况

    一.UIKit结构图 ------------------------------------------------------------------------------- @interfac ...

  6. 13 KNN背景分割器

    传统的前景背景分割方法有GrabCut,分水岭算法,当然也包括一些阈值分割的算法.但是这些算法在应用中往往显得鲁棒性较弱,达不到一个好的分割效果. 现代的背景分割算法融入了机器学习的一些方法来提高分类 ...

  7. Hihocoder 1275 扫地机器人 计算几何

    题意: 有一个房间的形状是多边形,而且每条边都平行于坐标轴,按顺时针给出多边形的顶点坐标 还有一个正方形的扫地机器人,机器人只可以上下左右移动,不可以旋转 问机器人移动的区域能不能覆盖整个房间 分析: ...

  8. python 按位置关系输出矩阵元素

    描述:依次输出矩阵中最近邻的元素 例如:输入: [[1, 2, 3] [4, 5, 6] [7, 8, 9]] 输出: [[ 1.  2.  4.  5.  3.  6.  7.  8.  9.] [ ...

  9. javascript数组&省市联动分别用js数组和JSON实现

    1.定义数组的三种方式: **数组可以存放不同的数据类型   第一种: var arr=[1,2,3];   var arr=[1,"2",true];   第二种: 使用内置对象 ...

  10. [转]Android进程间通信--消息机制及IPC机制实现

    Android为了屏蔽进程的概念,利用不同的组件[Activity.Service]来表示进程之间的通信! 组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Servi ...