#include<cstdio>
#include<cstring>
#include<algorithm>
#define R register
#define llt long long int
#define N 100000
using namespace std;
inline void read(llt& x){
char temp=getchar();bool u=0;
for(x=0;temp<'0'||temp>'9';u=temp=='-',temp=getchar());
for(;temp>='0'&&temp<='9';x=x*10+temp-'0',temp=getchar());
if(u)x=-x;
return ;
}
llt n,m,p;
llt A[N];
llt val[N<<2];
llt add[N<<2];
llt mul[N<<2];
inline llt add_(R llt x,R llt y){
return (x+y)%p;
}
inline llt mul_(R llt x,R llt y){
return (x*y)%p;
}
void init(llt k=1,llt l=1,llt r=n){
add[k]=0;
mul[k]=1;
if(l==r){
val[k]=A[l]%p;
return ;
}
R llt mid=(l+r)>>1;
init(k<<1,l,mid);
init(k<<1|1,mid+1,r);
val[k]=add_(val[k<<1],val[k<<1|1]);
return ;
}
void pushdown(llt &k,llt &l,llt &r,llt &mid){
R llt ls=k<<1,rs=k<<1|1;
val[ls]=mul_(val[ls],mul[k]);
val[rs]=mul_(val[rs],mul[k]);
val[ls]=add_(val[ls],add[k]*(mid-l+1));
val[rs]=add_(val[rs],add[k]*(r-mid));
mul[ls]=mul_(mul[ls],mul[k]);
mul[rs]=mul_(mul[rs],mul[k]);
add[ls]=mul_(add[ls],mul[k]);
add[rs]=mul_(add[rs],mul[k]);
add[ls]=add_(add[ls],add[k]);
add[rs]=add_(add[rs],add[k]);
add[k]=0;
mul[k]=1;
return ;
}
void ch1(llt &x,llt &y,llt &v,llt k=1,llt l=1,llt r=n){
if(l>=x&&y>=r){
mul[k]=mul_(mul[k],v);
add[k]=mul_(add[k],v);
val[k]=mul_(val[k],v);
return ;
}
R llt mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid)ch1(x,y,v,k<<1,l,mid);
if(mid<y)ch1(x,y,v,k<<1|1,mid+1,r);
val[k]=add_(val[k<<1],val[k<<1|1]);
return ;
}
void ch2(llt &x,llt &y,llt &v,llt k=1,llt l=1,llt r=n){
if(l>=x&&y>=r){
add[k]=add_(add[k],v);
val[k]=add_(val[k],mul_(v,r-l+1));
return ;
}
R llt mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid)ch2(x,y,v,k<<1,l,mid);
if(mid<y)ch2(x,y,v,k<<1|1,mid+1,r);
val[k]=add_(val[k<<1],val[k<<1|1]);
return ;
}
llt get(llt &x,llt &y,llt k=1,llt l=1,llt r=n){
if(l>=x&&y>=r)return val[k];
R llt mid=(l+r)>>1;
R llt res=0;
pushdown(k,l,r,mid);
if(x<=mid)res=add_(res,get(x,y,k<<1,l,mid));
if(mid<y)res=add_(res,get(x,y,k<<1|1,mid+1,r));
return res%p;
}
int main(){
R llt i,tmp,x,y;
read(n);
read(m);
read(p);
for(i=1;i<=n;i++)
read(A[i]);
init();
for(i=1;i<=m;i++){
read(tmp);
read(x);
read(y);
switch(tmp){
case 1:{
read(tmp);
ch1(x,y,tmp);
break;
}
case 2:{
read(tmp);
ch2(x,y,tmp);
break;
}
case 3:{
printf("%lld\n",get(x,y));
break;
}
}
}
return 0;
}

  

最新文章

  1. [LA4108]SKYLINE
  2. Selenium2学习-006-WebUI自动化实战实例-004-解决 Chrome 浏览器证书提示:--ignore-certificate-errors
  3. 一天弹出一次广告cookie
  4. Unity3D资源存放笔记
  5. Gulp自动构建Web前端程序
  6. Web API框架学习——消息管道(二)
  7. WdatePicker文本框显示当前日期和时间限制&lt;My97DatePicker两个日期范围不超过30天,第一个小于第二个,都不大于当前日期 &gt;
  8. PKUWC 2018游记
  9. jupyter notebook 代码自动补齐插件
  10. 监控服务器配置(一)-----Prometheus安装配置
  11. Mysql建库建用户建表等常用命令
  12. 实例:使用puppeteer headless方式抓取JS网页
  13. Lightning Chart 8.4版新功能
  14. Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析
  15. tp-02 四种url访问的方式
  16. Linux-vim编辑器与shell的简介
  17. selenium + python自动化测试unittest框架学习(三)webdriver元素操作(二)
  18. dbus启动失败:Couldn&#39;t connect to system bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
  19. Mybatis使用Redis二级缓存
  20. Jquery js框架使用

热门文章

  1. git查看/修改个人信息-用户名邮箱
  2. VS2019 MSB364 未找到框架“NETFramework,Version=v4.7”
  3. python3在mac下配置
  4. Docker第二弹之常用命令
  5. C# get files and write the files full name in txt
  6. 总结了Python中的22个基本语法
  7. TCP协议的三次握手与四次挥手
  8. centOS服务器安装mongodb
  9. crm-1
  10. CSS3常用新特性