输入

第1行:1个正整数n,表示操作数量,100≤n≤200,000
第2..n+1行:可能包含下面3种规则:
1个字母'I',紧接着1个数字k,表示插入一个数字k到树中,1≤k≤1,000,000,000,保证每个k都不相同
1个字母'Q',紧接着1个数字k。表示询问树中不超过k的最大数字
1个字母'D',紧接着2个数字a,b,表示删除树中在区间[a,b]的数。

输出

若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解

样例输入

6 I 1 I 2 I 3 Q 4 D 2 2 Q 2

样例输出

3 1
 

Splay模版

注意在平衡树中要加入INF 和 -INF 避免找不到比L小的数和比R大的数

细节在代码中:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<ctime>
using namespace std;
const int N=,INF=;
struct node
{
node *child[],*fa;
int x;
}a[N];
node *pos=a,*root;
void newnode(node *&r,int key,node *&fa)
{
r=pos++;
r->child[]=r->child[]=NULL;
r->x=key;r->fa=fa;
} void insert(node *&r,int key,node *fa)
{
if(r==NULL){
newnode(r,key,fa);
return ;
}
insert(r->child[key>r->x],key,r);
}
node *pre,*nxt;
void rotate(node *&r,bool t)//0left 1right
{
node *y=r->fa;
y->child[!t]=r->child[t];
if(r->child[t])r->child[t]->fa=y;
if(y->fa)y->fa->child[y->fa->child[]==y]=r;
r->fa=y->fa;
r->child[t]=y;
y->fa=r;
}
void check(node *r)//输出整个SPLAY
{
if(r==NULL)return ;
printf("x=%d lchild=%d rchild=%d\n",r->x,(r->child[]==NULL?NULL:r->child[]->x),r->child[]==NULL?NULL:r->child[]->x);
check(r->child[]);
check(r->child[]);
}
void getpre(node *r,int key)
{
if(r==NULL)return ;
if(key<=r->x)getpre(r->child[],key);
else pre=r,getpre(r->child[],key);
}
void getnext(node *r,int key)
{
if(r==NULL)return ;
if(key>=r->x)getnext(r->child[],key);
else nxt=r,getnext(r->child[],key);
}
void getans(node *r,int key)
{
if(r==NULL)return ;
if(key<r->x)getans(r->child[],key);//注意这里key<r->x不能取等
else pre=r,getans(r->child[],key);
}
void splay(node *r,node *g)
{
while(r->fa!=g)
{
if(r->fa->fa==g)rotate(r,r->fa->child[]==r);
else{
node *y=r->fa;
bool b=y->fa->child[]==y;
if(y->child[b]==r)rotate(r,!b);
else rotate(y,b);
rotate(r,b);
}
}
if(g==NULL)root=r;
} void work(int l,int r)
{
getpre(root,l);getnext(root,r);
splay(pre,NULL);
splay(nxt,pre);
root->child[]->child[]=NULL;
}
void haha()//**********插入INF 和 -INF 避免找不到小于l和大于r的数*************
{
insert(root,INF,NULL);insert(root,-INF,NULL);
return ;
}
int main()
{
haha();
int n,x,y;char ch;
scanf("%d",&n);
while(n--)
{
scanf("\n%c%d",&ch,&x);
if(ch=='I'){
insert(root,x,NULL);
}
if(ch=='Q'){
getans(root,x);
printf("%d\n",pre->x);
}
if(ch=='D'){
scanf("%d",&y);
work(x,y);
}
}
}

[Splay模版1]的更多相关文章

  1. splay模版

    //splay模版 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstrin ...

  2. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或 ...

  3. _bzoj3224 Tyvj 1728 普通平衡树【Splay】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3224 保存splay模版 一刻不停写了一个小时多一点,幸好一遍过了!(其实带着freopen ...

  4. tyvj 1729 文艺平衡树

    文艺平衡树 From admin 背景 Background 此为平衡树系列第二道:文艺平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以 ...

  5. bzoj3223 文艺平衡树 codevs3303 翻转区间

    splay模版题吧 只有区间翻转 至于为什么要把须翻转区间旋到根 因为查找一个区间可以先找出他左端点左边第一个点和右端点x右边第一个点y 然后将x旋到根节点 y旋到x的右儿子 这样x的右边的点就是所有 ...

  6. ZJOI2006书架

    追yql做题记录的时候做到的……一道Splay模版题…… 啊LCT写久了都有点忘了Splay了(什么奇怪的逻辑?) 其实说白了五个操作: 1. 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后 ...

  7. 1439. Battle with You-Know-Who(splay树)

    1439 路漫漫其修远兮~ 手抄一枚splay树 长长的模版.. 关于spaly树的讲解   网上很多随手贴一篇 貌似这题可以用什么bst啦 堆啦 平衡树啦 等等 这些本质都是有共同点的 查找.删除特 ...

  8. BZOJ3224普通平衡树【Splay】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 11751  Solved: 5013 Descriptio ...

  9. Luogu1486郁闷的出纳员【Splay】

    P1486 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...

随机推荐

  1. Java的一些基础知识

    1.do-while循环不论循环条件判断结果,至少会执行一次. 2.Javac用于Java源代码文件编译成字节码的编译器. 3.import关键字导入包. 4.Java是Sun公司与1995年退出的高 ...

  2. SLF4J 的几种实际应用模式--之三:JCL-Over-SLF4J+SLF4J

    我们前面已经讲过了 SLF4J 的两种用法:SLF4J+Log4J  和 SLF4J+Logback,那是在比较理想的情况下,所用组件只使用了 SLF4J 这一种统一日志框架的时候.可是 JCL 一直 ...

  3. 解决MVC模型验证在IE 6 7下不起作用或者报错

    文件版本列出: Jquery版本1.7.1 jQuery Validation 版本1.9.0 (VS2012创建MVC项目自动生成的版本) 最好VS2012创建MVC项目自动生成的版本,而不是VS2 ...

  4. Hibernate中遇见的问题

    1.在用Hibernate写增删改查时,有两种方式:a.HQL语句,b.原生态sql语句 如果我要执行的语句是:select * from Question HQL是这么写的: Session ses ...

  5. CDMA sid, nid, bid 含义解释

    copyright@ celldb.cc SID 是系统识别码,每个地级市只有一个sid,是唯一的. NID是网络识别码,由各本地网管理,也就是由地级分公司分配.每个地级市可能有1到3个nid. BI ...

  6. span 右浮动折行 解决ie6/7中span右浮动折行问题

    A floated box is shifted to the left or right until its outer edge touches the containing block edge ...

  7. pyqt4实现tab界面切换

    (转:https://segmentfault.com/q/1010000005143428)

  8. Docx组件读写Word文档介绍

    Docx介绍 官方原文:DocX is a .NET library that allows developers to manipulate Word 2007/2010/2013 files, i ...

  9. Nagios邮件报警

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; line-height: 150%; fon ...

  10. if与switch的性能比较

    前言 之前学习Java时,遇到了个问题,有点纠结.当if与switch都实现相同的功能时,该改采用哪种方法实现?我并不懂得如何准确测量两者之间的性能区别,便在OlineJudge上找条该类型的题,来测 ...