#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. js日期格式验证

    js日期格式验证 <input type="text" maxLength='10' onkeyup='checkDate(this.value,jQuery(this)); ...

  2. Linux中设置别名alias永久生效

    现在有个项目目录位于/var/www/html/tp5下 这也是我经常用到的工作目录 为了避免每次进入此目录 都需要输入 cd /var/www/html/tp5 可以加上述命令加入别名 alias ...

  3. vue梳理(2)

    -app.vue作为根组件被挂载到index.html文件里,其他的所有组件都是在app.vue组件里做文章. 展示给用户的就是app.vue里的内容,你觉得删的没有内容了但实际还有很多是因为什么呢? ...

  4. mysql随机取一条记录

    function getTodayLook($limit) { $sql = "select * from `tvhome_movie_today` order by rand() limi ...

  5. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  6. 网络流最大流dinic

    hdu 6214 #include <bits/stdc++.h> #include<cstdio> #include<cstring> #include<q ...

  7. 1125. Chain the Ropes (25)

    Given some segments of rope, you are supposed to chain them into one rope. Each time you may only fo ...

  8. ZROI CSP-S失恋测(1)

    传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "怎么大家一个暑假不见都变菜了啊."--蔡老板 A 考虑一个\(nk^2\)的dp,按\(w_i\)排序,则每个组 ...

  9. expect自动远程拷贝脚本

    expect自动远程拷贝脚本,利用rsync命令,脚本内容如下: #!/usr/bin/expect -- proc Usage_Exit {self} { puts "" put ...

  10. 如何解决MSVCR120.dll在Windows上缺少错误?

    在安装MySQL的时候,执行mysqld的时候,提示msvcr120.dll,是因为计算机中丢失了 一些文件 然后点击我下载完成安装就好了, 备注:两个都得安装!