代码如下
#include<bits/stdc++.h>
#define ull unsigned long long
#define out(a); for(int opopop = 0;opopop < (sizeof a)/sizeof a[1];opopop++){printf("%d ",a[opopop]);}printf("\n");
using namespace std;
const int N = 1e5+5;
ull d[4*N],b[4*N],m[4*N],a[N];
int mod;
void build(int s, int t, int p) {
if (s == t)
{
d[p] = a[s] % mod;
return;
}
int mid = s + ((t - s) >> 1);
build(s, mid, p * 2);
build(mid + 1, t, p * 2 + 1);
d[p] = d[p * 2] + d[(p * 2) + 1];
d[p] %= mod;
b[p] = 0;
m[p] = 1;
}
void update(int l,int r, int c,int s,int t,int p,int mul)
{
if(l <= s and t <= r)
{
d[p] *= mul;
d[p] %= mod;
d[p] += (t - s + 1) * c;
d[p] %= mod;
b[p] += c * mul;
b[p] %= mod;
m[p] *= mul;
m[p] %= mod;
return;
}
int mid = s + ((t - s) >> 1);
if( (b[p] != 0 or m[p] != 1) and s != t)
{
d[p * 2] *= m[p];
d[p * 2] %= mod;
d[p * 2] += b[p] * (mid - s + 1);
d[p * 2] %= mod;
d[2 * p + 1] *= m[p];
d[p * 2 + 1] %= mod;
d[2 * p + 1] += b[p] * (t - mid);
d[p * 2 + 1] %= mod;
b[p] = 0;
m[p] = 1;
}
if(l <= mid)update(l,r,c,s,mid,p*2,mul);
if(r > mid)update(l,r,c,mid+1,t,p*2+1,mul);
d[p] = d[p * 2] + d[p * 2 + 1];
d[p] %= mod;
}
int getsum(int l,int r,int s,int t, int p)
{
if(l <= s and t <= r)return d[p];
int mid = s + ((t - s) >> 1);
if(b[p] != 0 or m[p] != 1)
{
d[p * 2] *= m[p];
d[p * 2] %= mod;
d[p * 2] += b[p] * (mid - s + 1);
d[p * 2] %= mod;
d[p * 2 + 1] *= m[p];
d[p * 2 + 1] %= mod;
d[p * 2 + 1] += b[p] * (t - mid);
d[p * 2 + 1] %= mod;
b[p * 2] += b[p];
b[p * 2 + 1] += b[p];
m[p * 2] *= m[p];
m[p * 2 + 1] *= m[p];
b[p] = 0;
m[p] = 1;
b[p * 2] %= mod;
b[p * 2 + 1] %= mod;
m[p * 2] %= mod;
m[p * 2 + 1] %= mod;
}
ull sum = 0;
if(l <= mid)sum = getsum(l,r,s,mid,p * 2);
if(r > mid)sum += getsum(l,r,mid+1,t,p * 2 + 1);
sum %= mod;
return sum;
}
int n;
int main()
{
//cout << "0";
scanf("%d %d\n",&n,&mod);
//mod = 0x3f3f3f3f;
//cout << "0";
for(int i = 1;i <= n;i++)
{
scanf("%d ",&a[i]);
}
//cout << "1";
build(1,n,1);
int m = 0;
scanf("\n%d",&m);
int t,g,c,o;
t = g = c = o = 0;
for(int i = 0;i <= m;i++)
{
scanf("\n%d ",&o);
switch(o)
{
case 1:
scanf("%d %d %d",&t,&g,&c);
update(t,g,0,1,n,1,c%mod);
break;
case 2:
scanf("%d %d %d",&t,&g,&c);
update(t,g,c%mod,1,n,1,1);
break;
case 3:
scanf("%d %d",&t,&g);
ull mul = getsum(t,g,1,n,1);
printf("%llu\n",mul % mod);
break;
}
o = 0;
}
return 0;
}