#include <bits/stdc++.h>
#define ll long long
#define N 4000010
using namespace std;
ll t[N],a[N],num[N],mt[N],mod;
void build(ll p, ll l, ll r)
{
mt[p]=1;
if(l==r){num[p]=a[l]%mod;return;}
ll mid=(l+r)>>1;
build(p<<1,l,mid);build(p<<1|1,mid+1,r);
num[p]=(num[p<<1]+num[p<<1|1])%mod;
}
void mp(ll p,ll l,ll r,ll x){mt[p]=mt[p]*x%mod;t[p]=t[p]*x%mod;num[p]=num[p]*x%mod;}
void upd(ll p,ll l,ll r,ll x){t[p]=(t[p]+x)%mod;num[p]=(num[p]+(r-l+1)*x)%mod;}
void pd(ll p,ll l,ll r)
{
ll mid =(l+r)>>1;
mp(p<<1,l,mid,mt[p]);mp(p<<1|1,mid+1,r,mt[p]);
upd(p<<1,l,mid,t[p]);upd(p<<1|1,mid+1,r,t[p]);
mt[p]=1;t[p]=0;
}
void add(ll L,ll R,ll l,ll r,ll p,ll x)
{
if (L<=l&&r<=R){t[p]=(t[p]+x)%mod;num[p]=(num[p]+(r-l+1)*x)%mod;return;}
pd(p,l,r);
ll mid=(l+r)>>1;
if (L<=mid)add(L,R,l,mid,p<<1,x);
if (R>=mid+1) add(L,R,mid+1,r,p<<1|1,x);
num[p]=(num[p<<1]+num[p<<1|1])%mod;
}
void mc(ll L, ll R, ll l, ll r, ll p, ll x)
{
if (L<=l&&r<=R){t[p]=t[p]*x%mod;mt[p]=mt[p]*x%mod;num[p]=num[p]*x%mod;return;}
pd(p,l,r);
ll mid=(l+r)>>1;
if(L<=mid)mc(L,R,l,mid,p<<1,x);
if(R>=mid+1)mc(L,R,mid+1,r,p<<1|1,x);
num[p]=(num[p<<1]+num[p<<1|1])%mod;
}
ll Q(ll L,ll R, ll l, ll r, ll p)
{
if (L<=l&&r<=R){return num[p]%mod;}
pd(p,l,r);
ll ans=0,mid=(l+r)>>1;
if(L<=mid)ans+=Q(L,R,l,mid,p<<1);
if(R>=mid+1)ans+=Q(L,R,mid+1,r,p<<1|1);
return ans%mod;
}
int main()
{
ll n, m;
cin>>n>>mod;
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
cin>>m;
build(1,1,n);
for (ll i=1,type,l,r,x;i<=m;i++)
{
scanf("%lld", &type);
if(type==1){scanf("%lld%lld%lld", &l,&r,&x); mc(l, r,1,n,1,x);}
else if(type==2){scanf("%lld%lld%lld",&l,&r,&x);add(l,r,1,n,1,x);}
else{scanf("%lld%lld", &l, &r);printf("%lld\n",Q(l,r,1,n,1)%mod);}
}
return 0;
}

AcWing 1277. 维护序列的更多相关文章

  1. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5504  Solved: 1937[Submit ...

  2. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  3. bzoj 维护序列seq(双标记线段树)

    Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 4184  Solved: 1518[Submit][Status][Discus ...

  4. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  5. 1798: [Ahoi2009]Seq 维护序列seq

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 2930  Solved: 1087[Submit ...

  6. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  7. Letters Removing CodeForces - 899F (线段树维护序列)

    大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...

  8. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  9. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

随机推荐

  1. HBase HA 集群环境搭建

    安装准备 确定已安装并启动 HDFS(HA)集群 角色分配如下: node-01: namenode datanode regionserver hmaster zookeeper node-02: ...

  2. python文件处理(对比和筛选)版本2

    场景:对比两个txt文件的差异,将对比结果写入html,将不同部分写入另一个txt #!/user/bin/python #!coding=utf-8 # -*- coding: utf-8 -*- ...

  3. https 真的安全吗,可以抓包吗,如何防止抓包吗

    Android_interview github 地址 大家好,我是程序员徐公,加上实习,有五年中大厂经验.自荐一下,可以关注我的微信公众号程序员徐公 公众号程序员徐公回复黑马,获取 Android ...

  4. 深入剖析 MySQL 自增锁

    之前的文章把 InnoDB 中的所有的锁都介绍了一下,包括意向锁.记录锁...自增锁巴拉巴拉的.但是后面我自己回过头去看的时候发现,对自增锁的介绍居然才短短的一段. 其实自增锁(AUTO-INC Lo ...

  5. Spring中的注解@

    @ResponseBody作用:@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如 ...

  6. 为Go项目编写Makefile

    为Go项目编写Makefile 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程. make介绍 make是一个构建自动化工具,会在当前目录下寻 ...

  7. THINKPHP_(7)_THINKPHP6的controller模型接收前端页面通过ajax返回的数据,会因为一个div而失败

    这个随笔比较短. 同样的前端页面代码,修改了一下,后端模型接收不到数据. 利用beyond compare软件比对两个前端文件, 发现多了一个</div>标签. 多了一个</div& ...

  8. MindInsight计算图可视设计

    MindInsight计算图可视设计 特性背景 计算图可视的功能,主要协助开发者在下面这些场景中使用. 开发者在编写深度学习神经网络的代码时,可以使用计算图的功能查看神经网络中算子的数据流走向,以及模 ...

  9. MLIR多级中间表示概述

    MLIR多级中间表示概述 MLIR项目是构建可重用和可扩展的编译器基础设施的一种新方法.MLIR旨在解决软件碎片化问题,改进异构硬件的编译,显著降低构建特定领域编译器的成本,并帮助将现有编译器连接在一 ...

  10. ARM Cortex-M嵌入式C基础编程(下)

    ARM Cortex-M嵌入式C基础编程(下) ARM Cortex-M Embedded C Fundamentals/Tutorial -Aviral Mittal Load Region Vs ...