```cpp
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define bug(x) cout<<"Bug "<<(x)<<endl
#define el putchar('\n')
#define sp putchar(' ')
#define int ll
using namespace std;
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;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N=1e5+10;
int n,m,q;
int a[N];
int mod;
struct node
{
int sum,siz,plus,mul=1;
}t[N*4];
void pushup(int p)
{
t[p].sum=(t[p*2].sum%mod+t[p*2+1].sum%mod)%mod;
t[p].siz=t[p*2].siz+t[p*2+1].siz;
return ;
}
void pushdown(int p,int l,int r)
{
int mid=(l+r)>>1;
t[p*2].sum=(t[p*2].sum*t[p].mul+t[p].plus*(mid-l+1))%mod;
t[p*2+1].sum=(t[p*2+1].sum*t[p].mul+t[p].plus*(r-mid))%mod;
t[p*2].mul=(t[p*2].mul*t[p].mul)%mod;
t[p*2+1].mul=(t[p*2+1].mul*t[p].mul)%mod;
t[p*2].plus=(t[p*2].plus*t[p].mul+t[p].plus)%mod;
t[p*2+1].plus=(t[p*2+1].plus*t[p].mul+t[p].plus)%mod;
t[p].mul=1;
t[p].plus=0;
return ;
}
void build(int p,int l,int r)
{
if(l==r)
{
t[p].sum=a[l]%mod;
t[p].siz=1;
return ;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
pushup(p);
return ;
}
void add(int p,int l,int r,int x,int y,int w)
{
if(y<l || x>r) return ;
if(l>=x && r<=y)
{
t[p].sum=(t[p].sum%mod+(t[p].siz*w)%mod)%mod;
t[p].plus=(w%mod+t[p].plus%mod)%mod;
return ;
}
pushdown(p,l,r);
int mid=(l+r)>>1;
if(x<=mid) add(p*2,l,mid,x,y,w);
if(y>=mid+1) add(p*2+1,mid+1,r,x,y,w);
pushup(p);
return ;
}
void mult(int p,int l,int r,int x,int y,int w)
{
if(y<l || x>r) return ;
if(l>=x && r<=y)
{
t[p].sum=(t[p].sum*w)%mod;
t[p].mul=(t[p].mul*w)%mod;
return ;
}
pushdown(p,l,r);
int mid=(l+r)>>1;
if(x<=mid) mult(p*2,l,mid,x,y,w);
if(y>=mid+1) mult(p*2+1,mid+1,r,x,y,w);
pushup(p);
return ;
}
int query(int p,int l,int r,int x,int y)
{
if(y<l || x>r) return 0;
if(l>=x && r<=y)
{
return t[p].sum%mod;
}
pushdown(p,l,r);
int res=0;
int mid=(l+r)>>1;
if(x<=mid) res=(res%mod+query(p*2,l,mid,x,y)%mod)%mod;
if(y>=mid+1) res=(res%mod+query(p*2+1,mid+1,r,x,y)%mod)%mod;
return res;
}
signed main()
{
freopen("P3373_1.in","r",stdin);
// freopen(".out","w",stdout);
n=read();m=read();q=read();
mod=q;
for(int i=1;i<=n;i++)
{
a[i]=read();
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op=read(),x=read(),y=read(),k;
if(op==1)
{
k=read();
mult(1,1,n,x,y,k);
}
else if(op==2)
{
k=read();
add(1,1,n,x,y,k);
}
else
{
write(query(1,1,n,x,y)%mod);el;
}
// bug(query(1,1,n,x,x));
}
return 0;
}
```
by T1EM1E @ 2023-08-02 10:03:27
没去freopen?
by Ether13 @ 2023-08-02 17:01:44
@[htoworz](/user/515717) freopne 是调试用的
by T1EM1E @ 2023-08-02 17:48:28
@[T1EM1E](/user/643058)
mult里
```
if(l>=x && r<=y)
{
t[p].sum=(t[p].sum*w)%mod;
t[p].mul=(t[p].mul*w)%mod;
return ;
}
```
$t[p].plus$也要×w
by Ether13 @ 2023-08-02 20:34:02
@[htoworz](/user/515717) 谢谢。
此贴终。
by T1EM1E @ 2023-08-02 20:51:59