题目链接: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. storm中KafkaSpout的选择

    Storm最常用的消息源就是Kafka,在对接的时候大多需要使用KafkaSpout: 在网上大概有两种KafkaSpout,一种是只有几十行,一种却有一大啪啦类文件. 在kafka中,同一个part ...

  2. elasticsearch fitler查询例子

  3. pom.xml无法引入本地的jar和安装到本地安装maven 错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher

    今天maven突然无法引入本地maven库的jar包,导致maven工程出错,然后就准备重装maven ,开始只是将环境变量删除,将之前的压缩包解压,再重新配置环境 变量,可是配置好后在dos窗口 输 ...

  4. js 中移动元素的方法

    2017-12-13 19:59:24 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  5. 5、Angular2 Injectable 服务

    1.Injectable 

  6. List< >泛型集合

    //一旦你确定了泛型的类型,集合里的元素已经有了确切的定义 List<int> list = new List<int>();  //创建泛型集合的对象 list.Add(); ...

  7. .net生成cookie,读取cookie,创建特性

    1.登录或注册成功时生成票据和cookie 注释:__JZY_Common_User_Login_Cookie__:就是为了判断当前登录人(例如:管理员和普通用户,可以定义两个常量,可有可无) 2.读 ...

  8. Java笔记之Scanner先读取一个数字,在读取一行字符串方法分析

    问题:大家在学习Java读取数据的时候一般都是使用Scanner方法读取数据,但是其中有一个小问题大家可能不知道, 就是我们在使用scanner的时候如果你先读取一个数字,在读取一行带有空格的字符串, ...

  9. oracle OTT 学习

    1.OTT概念 OTT 是 Object Type Translator 的缩写,对象类型转换器.它是用来将数据库中定义的类型(UDT)转换为C结构体类型的工具.借助OTT 可以用C语言调用OCI来访 ...

  10. PAT 1051 Pop Sequence

    #include <cstdio> #include <cstdlib> #include <vector> using namespace std; bool p ...