好题.

Code:

#include<bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
namespace fhqtreap{
#define maxn 20000000
#define ll long long
int tot,m,tr;
int trash[maxn];
int ls[maxn],rs[maxn],rev[maxn],val[maxn],sz[maxn],key[maxn];
int root[maxn];
ll sumv[maxn];
ll lastans;
void ini(){
tr=0;
for(int i=1;i<1000000;++i) trash[++tr]=i;
tot=1000001;
}
int newnode(){
return tr?trash[tr--]:++tot;
}
int cpy(int p){
int x=newnode();
sz[x]=sz[p],ls[x]=ls[p],rs[x]=rs[p];
rev[x]=rev[p],val[x]=val[p],key[x]=key[p],sumv[x]=sumv[p];
return x;
}
void up(int x){
sz[x]=sz[ls[x]]+sz[rs[x]]+1;
sumv[x]=sumv[ls[x]]+sumv[rs[x]]+(long long)val[x];
}
int New(int v){
int p=newnode();
sz[p]=1,ls[p]=rs[p]=0,sumv[p]=val[p]=v,key[p]=rand(),rev[p]=0;
return p;
}
void era(int x){
sz[x]=ls[x]=rs[x]=rev[x]=val[x]=sumv[x]=key[x]=0;
trash[++tr]=x;
}
void pd(int x){
if(!x||!rev[x]) return;
if(rev[x]){
swap(ls[x],rs[x]);
if(ls[x]) ls[x]=cpy(ls[x]),rev[ls[x]]^=1;
if(rs[x]) rs[x]=cpy(rs[x]),rev[rs[x]]^=1;
rev[x]=0;
}
}
void split(int x,int k,int &l,int &r){
if(x){
pd(x);
if(k<=sz[ls[x]]) {
r=cpy(x);
split(ls[r],k,l,ls[r]);
up(r);
}
else {
l=cpy(x);
split(rs[l],k-sz[ls[l]]-1,rs[l],r);
up(l);
}
}else l=r=0;
}
int mg(int l,int r){
if(l&&r){
if(key[l]<key[r]) {
pd(r),ls[r]=mg(l,ls[r]),up(r);
return r;
}else {
pd(l),rs[l]=mg(rs[l],r),up(l);
return l;
}
}else return l+r;
}
void ins(int &rt,int p,int v){
int x,y;
split(rt,p,x,y);
rt=mg(mg(x,New(v)),y);
}
void Del(int &rt,int p){
int x,y,z;
split(rt,p,x,y),split(x,p-1,x,z),era(z);
rt=mg(x,y);
}
void Rev(int &rt,int L,int R){
int x,y,z;
split(rt,R,x,y),split(x,L-1,x,z),rev[z]^=1;
rt=mg(mg(x,z),y);
}
void Q(int &rt,int L,int R){
int x,y,z;
split(rt,R,x,y),split(x,L-1,x,z), printf("%lld\n",(lastans=sumv[z]));
rt=mg(mg(x,z),y);
}
int main(){
ini();
int n,a=0,b=0;
scanf("%d",&n);
for(int opt,v,i=1;i<=n;++i){
scanf("%d%d",&v,&opt);
root[i]=root[v];
scanf("%d",&a),a^=lastans;
if(opt!=2) scanf("%d",&b),b^=lastans;
if(opt==1) ins(root[i],a,b);
if(opt==2) Del(root[i],a);
if(opt==3) Rev(root[i],a,b);
if(opt==4) Q(root[i],a,b);
}
return 0;
}
};
int main(){
//setIO("input");
fhqtreap::main();
return 0;
}

  

luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap的更多相关文章

  1. P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap

    P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...

  2. 洛谷P5055 可持久化文艺平衡树 (可持久化treap)

    题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...

  3. 【模板】可持久化文艺平衡树-可持久化treap

    题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...

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

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

  5. 【LG5055】可持久化文艺平衡树

    [LG5055]可持久化文艺平衡树 题面 洛谷 题解 终于不可以用\(Trie\)水了... 和普通的\(FHQ\;treap\)差不多 注意一下\(pushdown\).\(split\)要新开节点 ...

  6. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  7. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  8. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  9. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

随机推荐

  1. c++ socket C/S通信实例

    具体的实例连接: 客户端项目连接:http://pan.baidu.com/s/1c2MndTI 服务端项目连接:http://pan.baidu.com/s/1i4DFkFV 用vs2013打开,服 ...

  2. BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机_栈

    Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...

  3. Oracle 知识积累

    1.oracle存储过程中is和as的区别 在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别,在视图(VIEW)中只能用AS不能用IS,在游标(CURSOR)中只能用IS不能用AS ...

  4. [bzoj2662 BeiJing wc2012] 冻结 (分层图+最短路)

    传送门 Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„&q ...

  5. FFMpeg 常用命令格式转换,视频合成

    FFmpeg都是命令行的,用起来肯定不方便.但是,这对技术宅应该不成问题.下面,我就罗列一些比较实用的使用方法吧. FFmpeg的下载与安装 FFmpeg是开源的.但我们不必去下载它的源代码.下载已经 ...

  6. anaconda jupyter

    本文主要讲解在Ubuntu系统中,如何在Anaconda下安装TensorFlow以及配置Jupyter Notebook远程访问的过程. 在官方文档中提到,TensorFlow的安装主要有以下五种形 ...

  7. MySQL主要命令(2)

    创建表 : create table if not exists employee( //格式:变量名 数据类型, id int, name varchar(30), sex varchar(2), ...

  8. Elasticsearch Sliced Scroll分页检索案例分享

    面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>   The best elasticsearch highlevel java rest api-----bboss ...

  9. 60款开源云应用【Part 3】(60 Open Source Apps You Can Use in the Cloud)

    60款开源云应用[Part 3](60 Open Source Apps You Can Use in the Cloud) 本篇翻译自http://www.datamation.com/open-s ...

  10. java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException

    http://blog.csdn.net/you23hai45/article/details/70197502