struct Node {
int pri, data, num, sz, ch[2], fa;
}t[maxn]; int pos; struct Treap {
int root;
int newNode(int x) {
t[++ pos] = (Node){rand(), x, 1, 1, 0, 0, 0};
return pos;
}
void update(int x) {
t[x].sz = t[t[x].ch[0]].sz + t[t[x].ch[1]].sz + t[x].num;
}
int locate(int x) {
return x == t[t[x].fa].ch[1];
}
void rotate(int x){
int y = t[x].fa, z = t[y].fa, p = locate(x);
t[y].ch[p] = t[x].ch[p ^ 1], t[x].ch[p ^ 1] = y, t[t[y].ch[p]].fa = y;
t[x].fa = t[y].fa, t[y].fa = x;
update(y), update(x);
if (z) {
t[z].ch[t[z].ch[1] == y] = x;
update(z);
}
}
void maintain(int x) {
while (x) {
update(x);
x = t[x].fa;
}
}
void insert(int data) {
if (root == 0) {
root = newNode(data);
return ;
}
int x = root;
while (true) {
if (t[x].data == data){
t[x].num ++;
break;
}
int p = data > t[x].data;
if (!t[x].ch[p]) {
t[x].ch[p] = newNode(data);
t[t[x].ch[p]].fa = x;
x = t[x].ch[p];
break;
}
x = t[x].ch[p];
}
maintain(x);
while (t[x].fa && t[t[x].fa].pri < t[x].pri)
rotate(x);
if (t[x].fa == 0)
root = x;
}
int get_pos(int data) {
int x = root;
while (true) {
if (t[x].data == data)
return x;
int p = data > t[x].data;
x = t[x].ch[p];
}
return x;
}
void del(int data) {
int x = get_pos(data);
if (t[x].num > 1){
t[x].num --;
maintain(x);
return ;
}
while (t[x].ch[0] + t[x].ch[1]) {
int p = t[t[x].ch[1]].pri > t[t[x].ch[0]].pri;
rotate(t[x].ch[p]);
if (t[t[x].fa].fa == 0)
root = t[x].fa;
}
t[x].num = 0;
maintain(x);
t[t[x].fa].ch[locate(x)] = 0;
t[x].fa = 0;
if (root == x)
root = 0;
}
int rks(int data) {
int x = root;
int res = 0;
while (true) {
if (t[x].data == data)
return res + t[t[x].ch[0]].sz + 1;
if (t[x].data < data)
res += t[x].num + t[t[x].ch[0]].sz;
x = t[x].ch[(data > t[x].data)];
}
}
int kth(int k) {
int x = root;
while (x) {
if (t[t[x].ch[0]].sz >= k)
x = t[x].ch[0];
else if (t[x].num + t[t[x].ch[0]].sz >= k)
return t[x].data;
else k -= t[x].num + t[t[x].ch[0]].sz, x = t[x].ch[1];
}
}
int pre(int data) {
int x = root, ans;
while (x) {
if (t[x].data < data)
ans = t[x].data, x = t[x].ch[1];
else x = t[x].ch[0];
}
return ans;
}
int suf(int data) {
int x = root, ans;
while (x) {
if (t[x].data > data)
ans = t[x].data, x = t[x].ch[0];
else x = t[x].ch[1];
}
return ans;
}
}treap;

Treap 模板代码的更多相关文章

  1. BZOJ 1588: Treap 模板

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12171  Solved: 4352 Description ...

  2. inputstream和outputstream读写数据模板代码

    //读写数据模板代码 byte buffer[] = new byte[1024]; int len=0; while((len=in.read(buffer))>0){ out.write(b ...

  3. eclipse 中 Servlet 模板代码(其实是代码提示模板)

    说的是模板代码,应该说的是提示的模板代码,并不是一新建就会出现模板. 第一步:先建一个Servlet文件,写好自己想要的模板 我的模板如下: 全选并复制,等会要粘贴到Servlet的提示模板中. pa ...

  4. 用Case类生成模板代码

    将类定义为case类会生成许多模板代码,好处在于: ①会生成一个apply方法,这样就可以不用new关键字创建新的实例. ②由于case类的构造函数参数默认是val,那么构造函数参数会自动生成访问方法 ...

  5. django2用模板代码图标字体丢失报404 cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff

    以前开发网站,不是用php就是用c#或java写后端,跟后端繁重麻烦的代码相比,前端的html+css+JavaScript简直就简单的不算技术,相比之下,工作量也不大. 但如果用django框架,使 ...

  6. 修改servlet的模板代码

    实际开发中,这些生成的代码和注释一般我们都用不到的,每次都要手工删除这些注释和代码,很麻烦.下面以MyEclipse 2014(其实版本通用的,都可以修改)为例进行说明如何修改Servlet的模板代码 ...

  7. c#字符串加载wpf控件模板代码 - 简书

    原文:c#字符串加载wpf控件模板代码 - 简书 ResourceManager resManagerA = new ResourceManager("cn.qssq666.Properti ...

  8. 在pycharm中自定义模板代码,快速输出固定代码块

    pycharm中有时会经常输出固定一段代码,为避免每次重复输入,可以自定义一段模板代码,请看以下图教程: 1.  点击 file   里面的   setting 2. 在搜索框输入live,就会显示出 ...

  9. Flask数据库常见关系模板代码

    常见关系模板代码 以下罗列了使用关系型数据库中常见关系定义模板代码 一对多 示例场景: 用户与其发布的帖子(用户表与帖子表) 角色与所属于该角色的用户(角色表与多用户表) 示例代码 class Rol ...

  10. flask 常见关系模板代码

    以下罗列了使用关系型数据库中常见关系定义模板代码 一对多示例场景:用户与其发布的帖子(用户表与帖子表)角色与所属于该角色的用户(角色表与多用户表)示例代码class Role(db.Model): & ...

随机推荐

  1. Vue之“表单修饰符”

    1.lazy:失去焦点时处理 案例1 2.number:限制只能输入数字 案例1 3.trim:去掉前后空格 案例1

  2. Python 深拷贝 vs 浅拷贝

    在一些业务场景中, 有时候我们需要复制一个对象, 但是又不想对原来的对象产生影响, 就想搞个 副本 来为所欲为地操作嘛. 但是呢, 在 Python中呢, 又不能通过 赋值 的方式达到效果, 为啥呢? ...

  3. c++单例模式总结

    分类 懒汉式:实例对象在第一次被使用时才进行初始化. 饿汉式:实例在定义时就被初始化. 特点 1.构造函数和析构函数私有化,不允许外部创建实例对象. 2.拷贝构造函数和复制运算符重载被delete,不 ...

  4. GPT 1-3 简单介绍

    GPT-1 简介 2018年6月,OpenAI公司发表了论文"Improving Language Understanding by Generative Pretraining" ...

  5. manim变换效果总结

    在ManimCE中,除了上一篇介绍的丰富的动画效果外,变换效果也是制作精彩视觉内容的重要工具. 变换效果主要用于改变对象的形状.大小.颜色或位置,让对象在动画中呈现出动态的变化. 本文详细总结了 Ma ...

  6. 第2讲、从启动到表单加载:Odoo 18 的完整执行流程详解

    了解 Odoo 在从启动到用户打开一个模型表单视图时,内部到底发生了什么,是模块开发.性能调优和故障排查的关键.本文将为你系统梳理 Odoo 18 的执行流程与关键方法调用链,适用于开发者与技术架构师 ...

  7. SQL语句中exists和in有何区别

       在SQL性能优化的时候,经常遇到是使用exists还是in提高效率的问题,这里结合之前写的两篇博客<MYSQL中in的用法>和<MYSQL中EXISTS的用法>,总结一下 ...

  8. linux配置Maxwell

    1.Maxwell-1.30.0及以上的版本不再支持JDK1.8,而JDK1.8支持的最后一个版本为1.29.2 2.下载Maxwell的压缩包,上传到服务器并解压 3.tar -xf maxwell ...

  9. kubernetes如何将pod运行在master节点

    一.简单说明 这里我们部署的Kubernetes集群,master节点默认是unscheduled的状态,也就是默认拒绝将Pod调度到master节点运行.专业术语就是:Master节点被赋予了一个或 ...

  10. AI接口实现:简单实现Viper配置管理

    简介 前面实现的一个简易suno-api.是使用cookie来获取suno-token发起请求的.当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了cookie的值,这种做法并不好,所 ...