#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;
}

  

[线段树]Luogu P3373 【模板】线段树 2的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

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

  2. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

    luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...

  4. hdu 1754 I Hate It (模板线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    M ...

  5. Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)

    Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...

  6. 【线段树】【P3372】模板-线段树

    百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...

  7. hdu1698(线段树区间替换模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意: 第一行输入 t 表 t 组测试数据, 对于每组测试数据, 第一行输入一个 n , 表示 ...

  8. HDU 1166 线段树模板&树状数组模板

    HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...

  9. Luogu P3960 列队 线段树

    题面 线段树入门题. 我们考虑线段树来维护这个矩阵. 首先我们先定n+1棵线段树前n棵维护每行前m-1个同学中没有离队过的同学,还有一棵维护第m列中没有离队过的同学.再定n+1棵线段树前n棵线段树维护 ...

随机推荐

  1. 使用 Powershell 远程连接 windows server

    使用 Powershell 远程连接 windows server Intro 最近我们的开发环境增加了一个 windows 服务器,没有界面的,不能直接远程桌面连上去管理,需要使用 Powershe ...

  2. oracle学习笔记(八)——结果集元数据ResultSetMetaData以及ResultSet转为对应的实体类框架

    介绍 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象,在持久框层框架(如:mybatis, hibernate)中被广泛的应用. 常用方法 int getColumnCount() ...

  3. C# - VS2019页面布局容器splitContainer和groupBox小结

    前言 在WinFrm应用程序中,产品的外观.布局将直接影响用户第一体验,所以对于开发者来说,在没有美工支持的前提下,应当注意系统页面的布局,本章主要讲解splitContainer和groupBox的 ...

  4. Java内存模型以及happens-before规则

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  5. SQLi-LABS Page-4 (Challenges) Less-54-Less-65

    Less-54 union - 1 http://10.10.202.112/sqli/Less-54?id=-1' union select 1,2,group_concat(table_name) ...

  6. 强大的Charles的使用,强大的flutter1.9

    <a href="http://www.cocoachina.com/articles/37551?filter=ios"> 强大的Charles 强大的flutter

  7. SRDC - ORA-1555: Query Duration 0: Checklist of Evidence to Supply (Doc ID 1682704.1)

    SRDC - ORA-1555: Query Duration 0: Checklist of Evidence to Supply (Doc ID 1682704.1) Action Plan 1. ...

  8. [PHP] 近期接手現有的企邮前端框架业务所遇困难

    1.邮箱前端有三大产品线,包括免费邮箱,VIP邮箱,企业邮箱,使用的一套代码,在代码中进行的逻辑判断处理,根据不同的配置进行不同的业务操作.有很多逻辑是各产品线是不同的,需要仔细开发和判断才能不会影响 ...

  9. 在Rust中使用C语言的库功能

    主要是了解unsafe{}语法块的作用. #[repr(C)] #[derive(Copy, Clone)] #[derive(Debug)] struct Complex { re: f32, im ...

  10. C++学习二 vector的用法(使用sort对于vector排序)

    一.vector的介绍 vector是C++里面的一个容器,也是我们数学上面理解的向量,有一些比较常见的操作. 二.vector的定义 #include<vector> using nam ...