#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll N=;
ll sum[N<<],lazy1[N<<],lazy2[N<<];
ll a[N];
ll n,m,p; inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} void build(ll cnt,ll l,ll r)
{
if(l==r)
{
sum[cnt]=a[l]%p;
return;
}
else
{
ll mid=(l+r)>>;
build(cnt<<,l,mid);
build((cnt<<)|,mid+,r);
sum[cnt]=(sum[cnt<<]+sum[(cnt<<)|])%p;
}
} inline bool cover(ll nl,ll nr,ll l,ll r)
{
return l<=nl&&r>=nr;
} inline bool intersection(ll nl,ll nr,ll l,ll r)
{
return l<=nr&&r>=nl;
} void pushdown(ll cnt,ll l,ll r)
{
ll mid=(l+r)>>;
lazy1[cnt<<]=(lazy1[cnt<<]*lazy2[cnt]+lazy1[cnt])%p;
lazy1[(cnt<<)|]=(lazy1[(cnt<<)|]*lazy2[cnt]+lazy1[cnt])%p;
lazy2[cnt<<]=(lazy2[cnt<<]*lazy2[cnt]%p)%p;
lazy2[(cnt<<)|]=(lazy2[(cnt<<)|]*lazy2[cnt]%p)%p;
sum[cnt<<]=((lazy1[cnt]*(mid-l+)%p)+(sum[cnt<<]*lazy2[cnt]%p))%p;
sum[cnt<<|]=((lazy1[cnt]*(r-mid)%p)+(sum[cnt<<|]*lazy2[cnt]%p))%p;
lazy2[cnt]=;
lazy1[cnt]=;
} void add1(ll cnt,ll nl,ll nr,ll l,ll r,ll a)
{
if(cover(nl,nr,l,r))
{
sum[cnt]=(sum[cnt]+(nr-nl+)*a%p)%p;
lazy1[cnt]=(lazy1[cnt]+a%p)%p;
return ;
}
pushdown(cnt,nl,nr);
ll mid=(nl+nr)>>;
if(intersection(nl,mid,l,r)) add1(cnt<<,nl,mid,l,r,a);
if(intersection(mid+,nr,l,r)) add1(cnt<<|,mid+,nr,l,r,a);
sum[cnt]=(sum[cnt<<]+sum[cnt<<|])%p;
} void add2(ll cnt,ll nl,ll nr,ll l,ll r,ll a)
{
if(cover(nl,nr,l,r))
{
sum[cnt]=(sum[cnt]*a)%p;
lazy1[cnt]=(lazy1[cnt]*a)%p;
lazy2[cnt]=(lazy2[cnt]*a)%p;
return ;
}
pushdown(cnt,nl,nr);
ll mid=(nl+nr)>>;
if(intersection(nl,mid,l,r)) add2(cnt<<,nl,mid,l,r,a);
if(intersection(mid+,nr,l,r)) add2(cnt<<|,mid+,nr,l,r,a);
sum[cnt]=(sum[cnt<<]+sum[cnt<<|])%p;
} ll query(ll cnt,ll nl,ll nr,ll l,ll r)
{
if(cover(nl,nr,l,r))
{
return sum[cnt]%p;
}
pushdown(cnt,nl,nr);
ll mid=(nl+nr)>>;
ll ans=;
if(intersection(nl,mid,l,r)) ans+=query(cnt<<,nl,mid,l,r)%p;
if(intersection(mid+,nr,l,r)) ans+=query(cnt<<|,mid+,nr,l,r)%p;
return ans;
} int main()
{
n=read(),m=read(),p=read();
for(ll i=;i<=n;i++)
a[i]=read();
for(int i=;i<=N<<;i++) lazy2[i]=;
build(,,n);
while(m--)
{
ll k;
k=read();
if(k==)
{
ll l=read(),r=read(),t=read();
add2(,,n,l,r,t);
}
if(k==)
{
ll l=read(),r=read(),t=read();
add1(,,n,l,r,t);
}
if(k==)
{
ll l=read(),r=read();
printf("%lld\n",query(,,n,l,r)%p);
}
}
}

P3373线段树2的更多相关文章

  1. 洛谷P3373线段树模板2

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

  2. P3373 线段树模板

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

  3. 【luogu P3373 线段树2】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3373 lazy标记两个,先乘后加 #include <iostream> #include &l ...

  4. 洛谷P3373 线段树2(补上注释了)

    毒瘤题.找了一下午+晚上的BUG,才发现原来query_tree写的是a%p; 真的是一个教训 UPD:2019.6.18 #include<iostream> #include<c ...

  5. P3373 线段树2(多重标记线段树)题解

    题意: 操作有:区间加,区间乘,区间询问求和 思路: 设一个数为\(m*sum+a\),加就变成了\(m*sum+a+a_2\),乘就变成了\(m*m_2*sum+a*m_2\),所以我们设两个标记\ ...

  6. 洛谷P3373 【模板】线段树 2

     P3373 [模板]线段树 2 47通过 186提交 题目提供者HansBug 标签 难度提高+/省选- 提交  讨论  题解 最新讨论 为啥WA(TAT) 题目描述 如题,已知一个数列,你需要进行 ...

  7. 洛谷 P3373 【模板】线段树 2 解题报告

    P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...

  8. AC日记——【模板】线段树 2 洛谷 P3373

    P3373 [模板]线段树 2387通过1.8K提交标签难度 提高+/省选- 提交 讨论 题解 最新讨论 更多讨论 2333最后三个点卡常数.迷之RE感觉这题很迷啊好像一共三组测试数据.友情提示:开l ...

  9. 洛谷——P3373 【模板】线段树 2&& B 数据结构

    P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 线段树维护区间乘法 1.如何 ...

随机推荐

  1. Luogu P5339 [TJOI2019]唱、跳、rap和篮球

    题目 设\(f_i\)表示从\((a-4i,b-4i,c-4i,d-4i)\)中选\(n-4i\)个排队的方案数. 那么我们可以容斥,答案为\(\sum\limits_{i=0}^{lim}(-1)^ ...

  2. Python中对 文件 的各种骚操作

    Python中对 文件 的各种骚操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getc ...

  3. vue-split-table【表格合并和编辑插件】

    前言 vue-split-table应用的效果图 vue-split-table开源地址,欢迎star,现在已经开源和同步到npm上轻松搞定表格拆分或者合并,编辑,再也不怕被产品怼啦 1.核心源码分析 ...

  4. Prometheus 2.14.0 新特性

    Prometheus 2.14.0 现在(2019.11.11)已经发布,在上个月的 2.13.0 之后又进行了一些修正和改进. 这次最大的新功能是基于 React 的新 UI,与现有 UI 大体相同 ...

  5. 原生js格式化json和格式化xml的方法

    在工作中一直看各位前辈的博客解决各种问题,对我的帮助很大,非常感谢! 之前一直比较忙没有写博客,终于过年有了点空闲时间,可以把自己积累的东西分享下,笔记中的部分函数不是自己写的,都是工作中一点点积累的 ...

  6. java中构造器(Constructor)

    大部分内容转自:http://tech.it168.com/j/2006-05-18/200605181021879.shtml        构造器是一个创建对象时被自动调用的特殊方法,为的是初始化 ...

  7. Apache 的 httpd.conf 配置文件

    http.conf 是 Apache 的配置文件,Apache 的常见配置主要是通过修该文件实现的,修改之后需要 重启 Apache 服务生效. Httpd.conf #Apache 安装目录 Ser ...

  8. Docker介绍,安装和常用的命令

    Docker是Google公司推出的Go语言开发的,基于Linux内核的cgroup,namespace,AUFS类的UnionFS等技术.对进程进行封装格力,属于操作系统层面的虚拟化技术.隔离的进程 ...

  9. Tensorflow fintune

    https://zhuanlan.zhihu.com/p/42183653 tf2.0中有更简单的做法,和keras一样

  10. 费用流+SPFA ||Luogu P3381【模板】最小费用最大流

    题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...