#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. inux软件安装管理之——dpkg与apt-*详解

    inux软件安装管理之--dpkg与apt-*详解 Nosee123关注 0.5922017.09.12 17:47:44字数 3,894阅读 8,565 [Linux软件安装管理系列]- - 传送门 ...

  2. IT菜鸟之DHCP

    DHCP 动态主机配置协议(Dynamic host configuration protocol) 作用:分配网络地址 选项: excluded-address 排除地址 pool IP地址池(网段 ...

  3. 关于Linux的一些基础命令

    今天学习scala语言,在linux系统上运行,发现对Linux的命令不太熟悉,为了熟悉掌握,也便于查询,这些命令主要是为了收藏备用,,希望能帮助到大家 linux20个常用命令是: 1.显示日期的指 ...

  4. [LeetCode] 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?

    都儿童节了,为什么要折磨一个几百个月大的孩子? 把题意读懂挺难的.不过读懂后基本也就知道怎么做了.恶心的是int类型可能会越界,要用long类型(很难想到).这题不好 [1744. 你能在你最喜欢的那 ...

  5. [leetcode] 117. 填充同一层的兄弟节点 II

    117. 填充同一层的兄弟节点 II 与116. 填充同一层的兄弟节点完全一样,二叉树的层次遍历..这是这次不是完美二叉树了 class Solution { public void connect( ...

  6. 摄像头 ISP 调试的入门之谈(经验总结)

    在讲述本文之前,我尽量以一个什么也不清楚的初学到入门的用词来阐述什么是 ISP 调试,以及为什么需要调试. 如果你从来都没有接触过什么是摄像头 ISP 调试,我想这个文章可以给你一些启发和关键词. 因 ...

  7. CVPR2020最新论文扫描盘点(下)

    CVPR2020最新论文扫描盘点(下) 最近计算机视觉三大顶会之一CVPR2020接收结果已经公布,一共有1470篇论文被接收,接收率为22%,相比去年降低3个百分点,竞争越来越激烈.这里整理来自Tw ...

  8. pytorch空间变换网络

    pytorch空间变换网络 本文将学习如何使用称为空间变换器网络的视觉注意机制来扩充网络.可以在DeepMind paper 阅读更多有关空间变换器网络的内容. 空间变换器网络是对任何空间变换的差异化 ...

  9. 使用现代C++如何避免bugs(上)

    使用现代C++如何避免bugs(上) How to avoid bugs using modern C++ C++的主要问题之一是拥有大量的构造,它们的行为是未定义的,或者程序员只是意想不到的.在各种 ...

  10. Nucleus-SE迁移:未实现的设施和兼容性

    Nucleus-SE迁移:未实现的设施和兼容性 Nucleus SE migration: Unimplemented facilities and compatibility Nucleus SE的 ...