只过了样例1、3、4,找了好久一直找不到问题qwq求大佬
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<string>
#include<string.h>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<utility>
#include<bitset>
#include<limits.h>
#include<iterator>
#include<numeric>
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)//手动开o2
#define ls (p<<1)//线段树左儿子
#define rs (p<<1|1)//线段树右儿子
#define mid (l+r>>1)//线段树mid
#define over(i,s,t) for(int i=s;i<=t;i++)
#define lver(i,t,s) for(int i=t;i>=s;i--)
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define lowbit(x) (x&-x)
//#define int _int128//水大数
using namespace std;
//#undef mid;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 1e5 + 5;
const LL mod = 1e9 + 7;
const LL INF = 0x3f3f3f3f;
const double PI=acos(-1);
const double EPS = 1e-10;//可近似为趋近0,可以根据定义求导时使用
const int base = 131;//base=1331//hash
int n,q,w;
LL a[N];
struct node{
int l,r;LL lazix,laziy=1,sum;
}tr[4*N+5];
void build(int p,int x,int y){
tr[p].l=x,tr[p].r=y;
if(x==y){
tr[p].sum=a[x]%w;
return;
}
int m=x+y>>1;
build(ls,x,m);
build(rs,m+1,y);
tr[p].sum=(tr[ls].sum+tr[rs].sum)%w;
}
void pushdown(int p){
if(tr[p].laziy!=1){
tr[ls].sum=(tr[ls].sum*tr[p].laziy)%w;
tr[rs].sum=(tr[rs].sum*tr[p].laziy)%w;
tr[ls].laziy=(tr[ls].laziy*tr[p].laziy)%w;
tr[rs].laziy=(tr[rs].laziy*tr[p].laziy)%w;
tr[p].laziy=1;
}
if(tr[p].lazix){
tr[ls].sum=(tr[ls].sum+tr[p].lazix*(tr[ls].r-tr[ls].l+1)%w)%w;
tr[rs].sum=(tr[rs].sum+tr[p].lazix*(tr[rs].r-tr[rs].l+1)%w)%w;
tr[ls].lazix=(tr[ls].lazix+tr[p].lazix)%w;
tr[rs].lazix=(tr[rs].lazix+tr[p].lazix)%w;
tr[p].lazix=0;
}
}
void pushup(int p){
tr[p].sum=(tr[ls].sum+tr[rs].sum)%w;
}
void update1(int p,int x,int y,LL k){
if(x<=tr[p].l&&y>=tr[p].r){
tr[p].sum=(tr[p].sum+k*(tr[p].r-tr[p].l+1)%w)%w;
tr[p].lazix=(tr[p].lazix+k)%w;
return;
}
pushdown(p);
int m=tr[p].l+tr[p].r>>1;
if(x<=m)update1(ls,x,y,k);
if(y>m)update1(rs,x,y,k);
pushup(p);
}
void update2(int p,int x,int y,LL k){
if(x<=tr[p].l&&y>=tr[p].r){
tr[p].sum=(tr[p].sum*k)%w;
tr[p].lazix=(tr[p].lazix*k)%w;
tr[p].laziy=(tr[p].laziy*k)%w;
return;
}
pushdown(p);
int m=tr[p].l+tr[p].r>>1;
if(x<=m)update2(ls,x,y,k);
if(y>m)update2(rs,x,y,k);
pushup(p);
}
LL query(int p,int x,int y){
LL res=0;
if(x<=tr[p].l&&y>=tr[p].r){
return tr[p].sum%w;
}
pushdown(p);
int m=tr[p].l+tr[p].r>>1;
if(x<=m)res=(res+query(ls,x,y))%w;
if(y>m)res=(res+query(rs,x,y))%w;
return res;
}
int main()
{
IOS;cin>>n>>q>>w;
over(i,1,n)cin>>a[i];
build(1,1,n);
while(q--){
int op;cin>>op;
if(op==1){
int x,y;LL k;cin>>x>>y>>k;
update2(1,x,y,k);
}
else if(op==2){
int x,y;LL k;cin>>x>>y>>k;
update1(1,x,y,k);
}
else{
int x,y;cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}