#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,val,com,s[];
struct st{
int l,r,val,add;
}tr[];
void build(int l,int r,int k)
{
tr[k].l=l;
tr[k].r=r;
if(l==r)
{
tr[k].val=s[l];
return;
}
int mid=(l+r)>>;
build(l,mid,k<<);
build(mid+,r,k<<|);
tr[k].val = tr[k<<].val + tr[k<<|].val;
}
void pus(int k)
{
int l=tr[k].l;
int r=tr[k].r;
tr[k].add+=tr[k>>].add;
tr[k].val+=(r-l+)*tr[k>>].add;
}
void update(int x,int y,int k,int val)
{
if(tr[k].add)
{
pus(k<<);
pus(k<<|);
tr[k].add=;
}
int l=tr[k].l;
int r=tr[k].r;
int mid=(l+r)>>;
if(y<l || x>r)
return;
if(x<=l && r<=y)
{
tr[k].val += (l-r+)*val;
tr[k].add += val;
return;
}
else
{
if(x<=mid)
update(x,y,k<<,val);
if(y>mid)
update(x,y,k<<|,val);
tr[k].val = tr[k<<].val + tr[k<<|].val;
}
}
int sum(int x,int y,int k)
{
if(tr[k].add)
{
pus(k<<);
pus(k<<|);
tr[k].add=;
}
int l=tr[k].l;
int r=tr[k].r;
int mid=(l+r)>>;
if(y<l || x>r)
return ;
if(x<=l && r<=y)
return tr[k].val;
else
{
int ans=;
if(x<=mid)
ans+=sum(x,y,k<<);
if(y>mid)
ans+=sum(x,y,k<<|);
return ans;
}
}
main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&s[i]);
build(,n,);
while(m--)
{
scanf("%d",&com);
if(com==)
{
scanf("%d%d%d",&x,&y,&val);
update(x,y,,val);
}
else
{
scanf("%d%d",&x,&y);
printf("%d\n",sum(x,y,));
}
}
}

带有lazy标记的线段树的更多相关文章

  1. HDU1698 just a Hook - 带有lazy标记的线段树

    2017-08-30 16:44:33 writer:pprp 上午刚刚复习了一下不带有lazy标记的线段树, 下午开始学带有lazy标记的线段树 这个是我看大佬代码敲的,但是出了很多问题, 这提醒我 ...

  2. HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)

    2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...

  3. 洛谷 1083 (NOIp2012) 借教室——标记永久化线段树 / 差分+二分

    题目:https://www.luogu.org/problemnew/show/P1083 听说线段树不标记永久化会T一个点. 注意mn记录的是本层以下.带上标记的min! #include< ...

  4. [HDU5306]Gorgeous Sequence(标记回收线段树)

    题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5 ...

  5. [hdoj4578][多延迟标记的线段树]

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  6. 可持久化线段树——区间更新hdu4348

    和线段树类似,每个结点也要打lazy标记 但是lazy标记和线段树不一样 具体区别在于可持久化后lazy-tag不用往下传递,而是固定在这个区间并不断累加,变成了这个区间固有的性质(有点像分块的标记了 ...

  7. NOIP2012 D2 T2 借教室 线段树 OR 二分法

    题目描述: 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...

  8. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  9. Codeforces 444C 线段树 懒惰标记

    前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记. 然后昨天真的是给这道题跪了,写了好久好久,...我本来是写了个add标 ...

随机推荐

  1. 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第3节 Calendar类_1_Calendar类介绍_获取对象的方式

    Calendar.getInstance()返回的就是Calendar的子类对象.GregorianCalendar 说明Calendar类重写了toSting的方法 时区亚洲的上海

  2. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_6_Map集合遍历键值对方式

    增强for

  3. SpringMVC起步(一)

    SpringMVC起步(一) 笔记来源于慕课网:https://www.imooc.com/video/7126/0 MVC:Model-View-Controller Model:模型层,业务数据的 ...

  4. Struts2异常:HTTP Status 404 - /Struts2/book/addBook.action

    HTTP Status 404 - /Struts2/book/addBook.action 如果在Struts2的框架中访问路径出现了这个错误,可能存在的原因有如下的两个: 1. 路径写错,也就是a ...

  5. C语言1-2019级秋季作业第一周作业

    1.你对软件工程专业或者计算机科学与技术专业了解是怎样? 软件工程专业是指对计算机的软件方面灵活掌控,开发软件的工程.软件工程其中会用到计算机科学.数学方面构建模型与算法:软件工程的目标就是开发出能够 ...

  6. Codeforces 1159E Permutation recovery(构造+拓扑)

    这道题其实只要解决了什么时候输出 -1 ,那么此题的构造方法也就解决了.首先我们可以观察这组 3 3 4 和 3 4 4 ,可以算出第二组是不成立的,在观察一组 2 3 4 5 和  3 2 4 5 ...

  7. SCAU 2015 GDCPC team_training0

    A.题目:http://acm.timus.ru/problem.aspx?space=1&num=2024 题意:求一个包含K个不同字符的集合的最大长度,还有组成这个长度的集合的个数 做法: ...

  8. Canvas和SVG的比较

    Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的. SVG SVG 是一种使用 XML 描述 2D 图形的语言. SVG 基于 XML,这意味着 SVG DOM 中的每个 ...

  9. MyEclipse项目向IDEA项目迁移

    1.首先选择File->New->Project from Existing sources/Project form Version Control,如果项目在你的本地则选择 Proje ...

  10. ReentrantLock等待通知机制Condition介绍

    Object类中的wait(),notify()和notifyAll()可以实现线程的等待通知模型,同样在ReentrantLock中可以借助Condition来完成这种机制.本篇就简要介绍Condi ...