还diff了下输出和答案

#include <bits/stdc++.h>
#define re register
#define int long long
// #define ll long long
// #define lls long long
#define pir make_pair
#define fr first
#define sc second
#define db double
using namespace std;
// const int mol=998244353;
const int maxn=2e5+10;
const int INF=1e9+10;
// inline int qpow(int a,int b) { int ans=1; while(b) { if(b&1) (ans*=a)%=mol; (a*=a)%=mol; b>>=1; } return ans; }
inline int read() {
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
// int check;
// vector<pair<int,int> > lazy[100010<<2];
#define lid id<<1
#define rid (id<<1)+1
struct TREE {
long long ans;
int num,mul,adds;
} tre[300000];
int n,mol,q,a[100000];
inline void build(int id,int l,int r) {
// if(l==1&& r==3) cout<<"id: "<<id<<endl;
tre[id].num=r-l+1; tre[id].mul=1;
if(l==r) { tre[id].ans=a[l]%mol; return ; }
int mid=(l+r)>>1;
build(lid,l,mid); build(rid,mid+1,r);
tre[id].ans=(tre[lid].ans+tre[rid].ans)%mol;
}
inline void putdown(int id) {
if(tre[id].num!=1) {
(tre[lid].mul*=tre[id].mul)%=mol;
(tre[lid].adds=tre[lid].adds*tre[id].mul%mol+tre[id].adds)%=mol;
tre[lid].ans=(tre[lid].ans*tre[id].mul%mol+tre[id].adds*tre[lid].num%mol)%mol;
(tre[rid].mul*=tre[id].mul)%=mol;
(tre[rid].adds=tre[rid].adds*tre[id].mul%mol+tre[id].adds)%=mol;
tre[rid].ans=(tre[rid].ans*tre[id].mul%mol+tre[id].adds*tre[rid].num%mol)%mol;
}
tre[id].mul=1,tre[id].adds=0;
}
inline void wor1(int id,int l,int r,int ll,int rr,int k) {
if(ll<=l&&r<=rr) { (tre[id].mul*=k)%=mol; (tre[id].adds*=k)%=mol; (tre[id].ans*=k)%=mol; return ; }
putdown(id); int mid=(l+r)>>1;
if(ll<=mid) wor1(lid,l,mid,ll,rr,k);
if(rr>mid) wor1(rid,mid+1,r,ll,rr,k);
tre[id].ans=(tre[lid].ans+tre[rid].ans)%mol;
}
inline void wor2(int id,int l,int r,int ll,int rr,int k) {
if(ll<=l&&r<=rr) { (tre[id].adds+=k)%=mol; (tre[id].ans+=tre[id].num*k%mol)%=mol; return ; }
putdown(id);
int mid=(l+r)>>1;
if(ll<=mid) wor2(lid,l,mid,ll,rr,k);
if(rr>mid) wor2(rid,mid+1,r,ll,rr,k);
tre[id].ans=(tre[lid].ans+tre[rid].ans)%mol;
}
inline int query(int id,int l,int r,int ll,int rr) {
if(r<ll||l>rr) return 0;
putdown(id);
if(ll<=l&&r<=rr) return tre[id].ans;
int mid=(l+r)>>1;
return (query(lid,l,mid,ll,rr)+query(rid,mid+1,r,ll,rr))%mol;
}
signed main(void) {
// freopen("plant3.in.txt","r",stdin);
// freopen("ansss.txt","w",stdout);
n=read(); q=read(); mol=read();
for(re int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
for(re int i=1,o,x,y,k;i<=q;i++) {
o=read(); x=read(); y=read(); k=(o==3)? INF:read();
if(o==3) printf("%lld\n",query(1,1,n,x,y));
if(o==1) wor1(1,1,n,x,y,k);
if(o==2) wor2(1,1,n,x,y,k);
}
}