【Splay】洛谷3372 【模板】线段树 1
Splay区间加,询问区间和。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 100010
#define INF 2147483647
int fa[maxn],val[maxn],c[maxn][2],root,tot,siz[maxn];
ll lazy[maxn],totalval2[maxn],val2[maxn];
void Maintain(int x)
{
siz[x]=siz[c[x][0]]+siz[c[x][1]]+1;
totalval2[x]=totalval2[c[x][0]]+totalval2[c[x][1]]+val2[x];
}
void mark(int x,ll delta){
if(x){
lazy[x]+=delta;
totalval2[x]+=(ll)siz[x]*delta;
val2[x]+=delta;
}
}
void pushdown(int x){
if(lazy[x]){
mark(c[x][0],lazy[x]);
mark(c[x][1],lazy[x]);
lazy[x]=0;
// Maintain(x);
}
}
void NewNode(int &x,int Fa,int key,ll key2)
{
x=++tot;
fa[x]=Fa;
c[x][0]=c[x][1]=0;
val[x]=key;
val2[x]=totalval2[x]=key2;
siz[x]=1;
}
void Rotate(int x,bool flag)
{
int y=fa[x];
pushdown(y);
pushdown(x);
c[y][!flag]=c[x][flag];
fa[c[x][flag]]=y;
if(fa[y]){
c[fa[y]][c[fa[y]][1]==y]=x;
}
fa[x]=fa[y];
c[x][flag]=y;
fa[y]=x;
Maintain(y);
}
void Splay(int x,int goal)
{
if(!x || x==goal){
return;
}
pushdown(x);
int y;
while((y=fa[x])!=goal){
if(fa[y]==goal){
Rotate(x,c[y][0]==x);
}
else{
if((c[y][0]==x)==(c[fa[y]][0]==y)){
Rotate(y,c[fa[y]][0]==y);
}
else{
Rotate(x,c[y][0]==x);
y=fa[x];
}
Rotate(x,c[y][0]==x);
}
}
Maintain(x);
if(!goal){
root=x;
}
}
int Find(int key,int x=root)
{
while(c[x][val[x]<key]){
if(val[x]==key){
return x;
}
x=c[x][val[x]<key];
}
return x;
}
void Insert(int key,ll key2)
{
if(!root){
NewNode(root,0,key,key2);
return;
}
int x=Find(key);
NewNode(c[x][val[x]<key],x,key,key2);
Splay(c[x][val[x]<key],0);
}
int n,m;
int main(){
int op,x,y;
ll z;
scanf("%d%d",&n,&m);
Insert(0,1ll);
for(int i=1;i<=n;++i){
scanf("%lld",&z);
Insert(i,z);
}
Insert(n+1,1ll);
for(;m;--m){
scanf("%d%d%d",&op,&x,&y);
Splay(x,0);
Splay(y+2,x);
if(op==1){
scanf("%lld",&z);
mark(c[y+2][0],z);
}
else{
printf("%lld\n",totalval2[c[y+2][0]]);
}
}
return 0;
}
【Splay】洛谷3372 【模板】线段树 1的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
		
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
 - 洛谷 - P1198 - 最大数 - 线段树
		
https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...
 - 洛谷 P2391 白雪皑皑 线段树+优化
		
题目描述: 现在有 \(N\) 片雪花排成一列. Pty 要对雪花进行$ M $次染色操作,第 \(i\)次染色操作中,把\((i*p+q)%N+1\) 片雪花和第\((i*q+p)%N+1\)片雪花 ...
 - 【洛谷】【线段树】P1471 方差
		
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
 - 【洛谷】【线段树】P1047 校门外的树
		
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
 - 【洛谷】【线段树】P1886 滑动窗口
		
[题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...
 - 【洛谷】【线段树】P3353 在你窗外闪耀的星星
		
[题目描述:] /* 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀 ...
 - 洛谷P5280 [ZJOI2019]线段树
		
https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不 ...
 - 洛谷P3374(线段树)(询问区间和,支持单点修改)
		
洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...
 - 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
		
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
 
随机推荐
- js_!和!!的使用
			
js中有些特殊的数据(“” 0 null undefined NaN),请求后台返回的数据中往往都有一些这样的数据,需要对这些数据进行过滤. 过滤代码 var a = 0;//0 "&quo ...
 - LINUX-内核-中断分析-中断向量表(3)-arm【转】
			
转自:http://blog.csdn.net/haolianglh/article/details/51986987 arm中断概念 在<ARM体系结构与编程>第9章中说到,ARM 中有 ...
 - sicily 1001. Fibonacci 2
			
1001. Fibonacci 2 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn-1 + F ...
 - 【bzoj3223】文艺平衡树
			
#include<bits/stdc++.h> #define N 300005 #define rat 4 using namespace std; struct Node{ int s ...
 - 谈谈mybatis逆向工程中的Example类
			
参考博客: http://openwares.net/database/mybatis_generator_example.html 一.Example类的作用:一个用于筛选复杂条件的类 二.Exam ...
 - 12-5 NSSet
			
原文:http://rypress.com/tutorials/objective-c/data-types/nsset NSSet NSSet, NSArray, and NSDictionary ...
 - JS如何获取Input的name或者ID?
			
<input name="music" type="image" id="music" onclick="loadmusic ...
 - 线程同步工具 Semaphore类使用案例
			
参考博文 : 线程同步工具(一) 线程同步工具(二)控制并发访问多个资源 并发工具类(三)控制并发线程数的Semaphore 使用Semaphore模拟互斥锁 当一个线程想要访问某个共享资源,首先,它 ...
 - LocalStorage、SessionStorage使用详解
			
https://blog.csdn.net/zhongzh86/article/details/55504381
 - 前端的3D(css3版本)--淘宝造物节3D创景的制作
			
其实是依托Css3的功劳,先上一个例子 链接: https://pan.baidu.com/s/1cZ-mMI01FHO3u793ZhvF2w 提取码: d3s7代码地址:链接: https://pa ...