#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1000005;
ll a[N],sum[N << 2],tag[N << 2],tagc[N<<2];
ll p;
void update(ll x,ll L,ll R) {
if(L != R)
{
sum[x] = sum[x << 1] + sum[x << 1 | 1];
}
}
void build(ll x,ll L,ll R) {
tagc[(L+R)>>1]=1;
if(L == R) {
tagc[x]=1;
sum[x]=a[L];
sum[x]%=p;
return;
}
ll mid = (L + R) >> 1;
build(x << 1, L, mid);
build(x << 1 | 1, mid + 1, R);
update(x, L, R);
}
void pushdown(int x, int L, int R) {
if(tag[x] == 0) return;
int mid = L + R >> 1;
if(L != R) {
tagc[x << 1] = tagc[x << 1] * tagc[x] % p;
tag[x << 1] = (tag[x << 1] * tagc[x] + tag[x]) % p;
sum[x << 1] = (sum[x << 1] * tagc[x] + tag[x] * (mid - L + 1)) % p;
tagc[x << 1 | 1] = tagc[x << 1 | 1] * tagc[x] % p;
tag[x << 1 | 1] = (tag[x << 1 | 1] * tagc[x] + tag[x]) % p;
sum[x << 1 | 1] = (sum[x << 1 | 1] * tagc[x] + tag[x] * (R - mid)) % p;
}
tagc[x] = tag[x] = 0;
}
// a[l...r] += v
void modify(ll x,ll L,ll R,ll l,ll r,ll v) {
pushdown(x, L, R);
if(L == l && R == r) {
tag[x] += v;
tag[x]%=p;
sum[x] += v * (R - L + 1);
sum[x]%=p;
return;
}
ll mid = (L + R) >> 1;
if(r <= mid) modify(x << 1, L, mid, l, r, v);
else if(l > mid) modify(x << 1 | 1, mid+1, R, l, r, v);
else{
modify(x << 1, L, mid, l, mid, v);
modify(x << 1 | 1, mid+1, R, mid+1, r, v);
}
update(x, L, R);
}
void cmodify(ll x,ll L,ll R,ll l,ll r,ll v) {
pushdown(x, L, R);
if(L == l && R == r) {
tagc[x] *= v;
tagc[x]%=p;
tag[x] *= v;
tag[x]%=p;
sum[x] *=v;
sum[x]+=tag[x];
sum[x]%=p;
return;
}
ll mid = (L + R) >> 1;
if(r <= mid) cmodify(x << 1, L, mid, l, r, v);
else if(l > mid) cmodify(x << 1 | 1, mid+1, R, l, r, v);
else{
cmodify(x << 1, L, mid, l, mid, v);
cmodify(x << 1 | 1, mid+1, R, mid+1, r, v);
}
update(x, L, R);
}
long long query_sum(ll x,ll L,ll R,ll l,ll r) {
pushdown(x, L, R);
// cout << L<<" "<<R<<" "<<sum[x]<<" "<<tag[x]<<endl;
if(l == L && r == R) return sum[x];
ll mid = (L + R) >> 1;
if(r <= mid) return query_sum(x << 1, L, mid, l, r);
else if(l > mid) return query_sum(x << 1 | 1, mid + 1, R, l, r);
else{
ll u = query_sum(x << 1, L, mid, l, mid);
ll v = query_sum(x << 1 | 1, mid + 1, R, mid + 1, r);
return (u+v)%p;
}
}
int main()
{
ll n,M;
scanf("%lld%lld%lld",&n,&M,&p);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
ll cmd,x,y,v;
while(M--)
{
scanf("%lld",&cmd);
if(cmd==1)
{
scanf("%lld%lld%lld",&x,&y,&v);
cmodify(1,1,n,x,y,v);
}
else if(cmd==2)
{
scanf("%lld%lld%lld",&x,&y,&v);
modify(1,1,n,x,y,v);
}
else
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query_sum(1,1,n,x,y));
}
/*for(ll i=1;i<=n;i++)
{
cout<<
}*/
}
return 0;
}
样例已过
分数0分
已经调了一个下午了