题目链接:https://www.luogu.org/problemnew/show/P3373

lazy标记两个,先乘后加

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define lson left, mid, rt<<1
#define rson mid+1, right, rt<<1|1
#define ll long long
using namespace std;
const int maxn = ;
ll n, m, addlazy[maxn<<], mullazy[maxn<<], ans[maxn<<], mod, x,y,k;
void PushUP(ll rt)
{
ans[rt] = (ans[rt<<] + ans[rt<<|])%mod;
}
void build(ll left, ll right, ll rt)
{
addlazy[rt] = ;
mullazy[rt] = ;
if(right == left)
{
scanf("%d",&ans[rt]);
return ;
}
ll mid = (left+right) >> ;
build(lson);
build(rson);
PushUP(rt);
}
void PushDOWN(ll rt, ll mid, ll left, ll right)
{
mullazy[rt<<]=(mullazy[rt<<]*mullazy[rt])%mod;
mullazy[rt<<|]=(mullazy[rt<<|]*mullazy[rt])%mod;
addlazy[rt<<]=(addlazy[rt<<]*mullazy[rt])%mod;
addlazy[rt<<|]=(addlazy[rt<<|]*mullazy[rt])%mod;
ans[rt<<]=(ans[rt<<]*mullazy[rt])%mod;
ans[rt<<|]=(ans[rt<<|]*mullazy[rt])%mod;
mullazy[rt]=;
addlazy[rt<<]=(addlazy[rt<<]+addlazy[rt])%mod;
addlazy[rt<<|]=(addlazy[rt<<|]+addlazy[rt])%mod;
ans[rt<<]=(ans[rt<<]+(mid-left+)*addlazy[rt])%mod;
ans[rt<<|]=(ans[rt<<|]+(right-mid)*addlazy[rt])%mod;
addlazy[rt]=;
}
void mulupdate(ll l, ll r, ll add, ll left, ll right, ll rt)
{
if(l<=left&&r>=right)
{
addlazy[rt] = (addlazy[rt]*add)%mod;
mullazy[rt] = (mullazy[rt]*add)%mod;
ans[rt] = (add*ans[rt])%mod;
return;
}
ll mid = (left+right)>>;
if(mullazy[rt]!=||addlazy[rt]>=) PushDOWN(rt,mid,left,right);
if(l<=mid) mulupdate(l,r,add,lson);
if(r>mid) mulupdate(l,r,add,rson);
PushUP(rt);
}
void addupdate(ll l, ll r, ll add, ll left, ll right, ll rt)
{
if(l<=left&&r>=right)
{
addlazy[rt]= (addlazy[rt]+add)%mod;
ans[rt] = (ans[rt] + add*(right-left+))%mod;
return;
}
ll mid = (left+right)>>;
if(mullazy[rt]!=||addlazy[rt]>=) PushDOWN(rt,mid,left,right);
if(l<=mid) addupdate(l,r,add,lson);
if(r>mid) addupdate(l,r,add,rson);
PushUP(rt);
}
ll query(ll l, ll r, ll left, ll right, ll rt)
{
ll res = ;
if(l <= left&&r >= right) return ans[rt]%mod;
ll mid = (left+right) >> ;
if(mullazy[rt]!=||addlazy[rt]>=) PushDOWN(rt, mid, left, right);
if(l <= mid) res = (res+query(l,r,lson))%mod;
if(r > mid) res = (res+query(l,r,rson))%mod;
return res%mod;
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
build(,n,);
while(m--)
{
int p;
scanf("%d",&p);
if(p == )
{
scanf("%d%d%d",&x,&y,&k);
mulupdate(x,y,k,,n,);
}
if(p == )
{
scanf("%d%d%d",&x,&y,&k);
addupdate(x,y,k,,n,);
}
if(p == )
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y,,n,));
}
}
return ;
}

【luogu P3373 线段树2】 模板的更多相关文章

  1. 【luogu P3372 线段树1】 模板

    线段树的模板题 题目链接:https://www.luogu.org/problemnew/show/P3372 update区间修改,query区间求和 #include <iostream& ...

  2. 洛谷P3373线段树模板2

    题目:https://www.luogu.org/problemnew/show/P3373 带乘的线段树,更新时把加的标记也乘一下,然后取值时先乘后加. 代码如下: #include<iost ...

  3. P3373 线段树模板

    好,这是一个线段树模板. #include <cstdio> using namespace std; ; long long int sum[N],tag1[N],tag2[N],mo; ...

  4. 线段树--线段树【模板1】P3372

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...

  5. BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)

    潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...

  6. 【原创】线段树query模板对比! 新手线段树的一个容易出错的问题!!因为我就糊涂了一整天.......

    我们解决问题的最好方法就是拿实例来举例子 我们来看tyvj1038或计蒜客 “管家的忠诚” 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管 ...

  7. Zeratul的完美区间(线段树||RMQ模板题)

    原题大意:原题链接 给定元素无重复数组,查询给定区间内元素是否连续 解体思路:由于无重复元素,所以如果区间内元素连续,则该区间内的最大值和最小值之差应该等于区间长度(r-l) 解法一:线段树(模板题) ...

  8. 矩形面积并-扫描线 线段树 离散化 模板-poj1151 hdu1542

    今天刚看到这个模板我是懵逼的,这个线段树既没有建树,也没有查询,只有一个update,而且区间成段更新也没有lazy标记....研究了一下午,我突然我发现我以前根本不懂扫描线,之所以没有lazy标记, ...

  9. 线段树基础模板&&扫描线

    线段树的单点更新+区间求和 hdu1166敌兵布阵 Input 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=),表示敌人有N个工兵营地 ,接下来有N个正整数,第i个正整 ...

随机推荐

  1. Kibana修改Time日志格式

    选择左侧management 打开Advanced Settings 编辑:dateFormat,默认格式是:MMMM Do YYYY, HH:mm:ss.SSS,修改为:YYYY-MM-DD HH: ...

  2. org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.

    今天报了这个异常,这是页面报的 org.springframework.dao.DataIntegrityViolationException: could not execute statement ...

  3. GridView, ListView 区别

    ListView, GridView部分的类层次结构 AbsListView的xml属性 android:listSelector 当前item高亮时,显示的drawable android:draw ...

  4. 3d旋转卡牌

    做成向中心缩放就行了,和旋转效果一样的

  5. Springboot - 集成 JPA

    1.什么是 JPA? JPA就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 2. JPA 具有什么优 ...

  6. 如何优化VMWare虚拟机的运行速度(转)

    虚拟机是个好东西,但是对电脑有一定的要求.尤其对做工控的来说都需要安装一些大型的软件(其中WINCC最难装,对系统要求较高.而且像WIN 7 64位的就别想装上去了,如果改系统后那4G以上的内存不就浪 ...

  7. 关于GBK、GB2312、UTF8之间的区别

    UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为( ...

  8. Hashtable 键值对集合

    // Hashtable  键值对集合 一个键对应一个值 Hashtable ht=new Hashtable(); ht.Add(,"张三"); ht.Add(,'男'); ht ...

  9. openlayers 聚合效果

    //cyd var cydclusterSource = new ol.source.Cluster({ distance: 40, source: new ol.source.Vector({ fe ...

  10. Cocos2d-x手游技术分享(1)-【天天打蚊子】数据存储与音效篇

    前言: 手游项目<天天打蚊子>终于上线,特地写几篇技术分享文章,分享一下其中使用到的技术,其中使用cocos2d-x引擎,首选平台iOS,也请有iPhone或者iPad的朋友帮忙下载好评. ...