#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define endl '\n'
using namespace std;
const int INF = 0x3fffffff, MAXN = 1e4+10;
const int N = 1e6+10;
int n, m,a[N], k,tag[4*N+10],tree[N * 4+10],tag1[4*N+10],mod;
int ls(int x)
{
return x << 1;
}
int rs(int x)
{
return x << 1 | 1;
}
void push_up(int x)
{
tree[x] = tree[ls(x)]+tree[rs(x)]%mod;
}
void build(int l, int r, int x)
{
if (l == r)
{
tree[x] = a[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls(x));
build(mid + 1, r, rs(x));
push_up(x);
}
int ans(int L, int R, int l, int r, int x)
{
if(l>r)return 0;
if (L <= l && R >= r)return tree[x];
int mid = (l + r) >> 1, sum = 0;
if(tag1[x])
{
tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
tree[ls(x)]*=tag1[x],tree[rs(x)]*=tag1[x];
tag1[ls(x)]*=tag1[x],tag1[rs(x)]*=tag1[x];
tag1[x]=0,tag[x]=0;
}
if(tag[x])
{
tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
tag[ls(x)]+=tag[x],tag[rs(x)]+=tag[x];
tag[x]=0;
}
if (L <= mid)sum+=ans(L, R, l, mid, ls(x));
if (R > mid)sum+=ans(L, R, mid+1, r, rs(x));
return sum%mod;
}
void change(int L, int R, int l, int r, int x,int k)
{
if(l>r)return;
if (L <= l && R >= r)
{
tree[x]+=(r-l+1)*k;
tree[x]%=mod;
tag[x]+=k;
return ;
}
int mid = (l + r) >> 1;
if(tag[x])
{
tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
tree[ls(x)]%=mod,tree[rs(x)]%=mod;
tag[ls(x)]+=tag[x],tag[rs(x)]+=tag[x];
tag[x]=0;
}
if (L <= mid)change(L, R, l, mid, ls(x),k);
if (R > mid)change(L, R, mid+1, r, rs(x),k);
push_up(x);
}
void change1(int L, int R, int l, int r, int x,int k)
{
if(l>r)return;
if (L <= l && R >= r)
{
tree[x]*=k;
tree[x]%=mod;
tag1[x]*=k;
return ;
}
int mid = (l + r) >> 1;
if(tag1[x])
{
tree[ls(x)]+=tag[x]*(mid-l+1),tree[rs(x)]+=tag[x]*(r-mid);
tree[ls(x)]*=tag1[x],tree[rs(x)]*=tag1[x];
tree[ls(x)]%=mod,tree[rs(x)]%=mod;
tag1[ls(x)]*=tag1[x],tag1[rs(x)]*=tag1[x];
tag1[x]=0,tag[x]=0;
}
if (L <= mid)change1(L, R, l, mid, ls(x),k);
if (R > mid)change1(L, R, mid+1, r, rs(x),k);
push_up(x);
}
signed main()
{
cin >> n>>m>>mod;
for (int i = 1; i <= n; i++)cin >> a[i];
// memset(tag1,1,sizeof(tag1));
build(1, n, 1);
for(int i=1; i<=m; i++)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1)
{
int k;
cin>>k;
change1(x,y,1,n,1,k);
}
if(op==2)
{
int k;
cin>>k;
change(x,y,1,n,1,k);
}
if(op==3)cout<<ans(x,y,1,n,1)%mod<<'\n';
// if(op!=3)
// {
// for(int i=1;i<=n;i++)cout<<ans(i,i,1,n,1)<<' ';
// cout<<'\n';
// }
}
return 0;
}
样例过了