题目链接: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. elasticsearch清空type下的所有数据

    DELETE /twitter/tweet/_query{"query": { "match_all": {} }} 注:twitter为index,tweet ...

  2. CSS布局——左定宽度右自适应宽度并且等高布局

    方法一: 别的不多说,直接上代码,或者参考在线DEMO,下面所有的DEMO都有HTML和CSS代码,感兴趣的同学自己慢慢看吧. HTML Markup <div id="contain ...

  3. bzoj 3243: [Noi2013]向量内积

    Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知 ...

  4. 1、块:ion-item

    因为ion-item 一般写于ion-list里 所以在ion-list里面我会仔细讲解. 1. ion-badge /* --- page1.html ---*/ <ion-navbar *n ...

  5. 如何查询日志文件中的所有ip,正则表达式

    IPV4必须满足以下四条规则: 1.任何一个1位或2位数字,即0-99: 2.任何一个以1开头的3位数字,即100-199: 3.任何一个以2开头.第2位数字是0-4之间的3位数字,即200-249: ...

  6. java 判断图片的类型

    // 这种方法如果遇到不是图片类型的文件会reader抛异常! public static void main(String[] args) throws IOException { // get i ...

  7. 【代码笔记】Java基础:Java的方法和类

    面向过程与面向对象都是我们编程中,编写程序的一种思维方式.例如:公司打扫卫生(擦玻璃.扫地.拖地.倒垃圾等), 按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生 ...

  8. Linux在Tomcat下部署JavaWeb项目

    一.Linux快速部署War包操作 1.先关闭Tomcat /home/java/tomcat8/bin/shutdown.sh 注意:进入tomcat bin目录下操作 2.进入War包存放目录(可 ...

  9. Android使用Gradle命令动态传参完成打包,不需要修改代码

    不得不说,Gradle很强大,有人会问Gradle是什么?这里也不细讲,在我认为他就是一个构建神器.Gradle 提供了: 一个像 Ant 一样的非常灵活的通用构建工具 一种可切换的, 像 Maven ...

  10. C# 生成CODE128条码

    using System; using System.Collections.Generic; using System.Data; using System.Drawing;    namespac ...