这是我的代码
#include<bits/stdc++.h>
#define N (int)1e5
#define int long long
using namespace std;
int n,q,m;
struct node
{
int v,l,r,a,m;
}t[4*N+5];
int a[N+5];
void build(int p,int x,int y)
{
t[p].l = x;t[p].r = y;
t[p].a = 0;t[p].m = 1;
if(x == y)
{
t[p].v = a[x]%m;
return;
}
int mid = (x+y)>>1;
build(2*p,x,mid);
build(2*p+1,mid+1,y);
t[p].v = (t[2*p].v + t[2*p+1].v)%m;
}
void pushdown(int p)
{
int l = t[p].l,r = t[p].r,mid = (t[p].l+t[p].r)>>1;
t[2*p].v = (t[2*p].v*t[p].m+t[p].a*(mid-l+1))%m;
t[2*p+1].v = (t[2*p+1].v*t[p].m+t[p].a*(r-mid))%m;
t[2*p].m = (t[2*p].m*t[p].m)%m;
t[2*p+1].m = (t[2*p+1].m*t[p].m)%m;
t[2*p].a = (t[2*p].a*t[p].m + t[p].a)%m;
t[2*p+1].a = (t[2*p+1].a*t[p].m + t[p].a)%m;
t[p].a = 0;
t[p].m = 1;
}
void mult(int p,int x,int y,int k)
{
if(x > t[p].r || y < t[p].l)return;
if(x <= t[p].l && t[p].r <= y)
{
t[p].v = (t[p].v * k)%m;
t[p].m = (t[p].m * k)%m;
t[p].a = (t[p].a * k)%m;
return;
}
pushdown(p);
int mid = (t[p].l+t[p].r)>>1;
if(x <= mid)mult(2*p,x,y,k);
if(y > mid)mult(2*p+1,x,y,k);
t[p].v = (t[2*p].v + t[2*p+1].v)%m;
}
void add(int p,int x,int y,int k)
{
if(x > t[p].r || y < t[p].l)return;
if(x <= t[p].l && t[p].r <= y)
{
t[p].v = (t[p].v + k)%m;
t[p].a = (t[p].a + k)%m;
return;
}
pushdown(p);
int mid = (t[p].l+t[p].r)>>1;
if(x <= mid)add(2*p,x,y,k);
if(y > mid)add(2*p+1,x,y,k);
t[p].v = (t[2*p].v + t[2*p+1].v)%m;
}
int ask(int p,int x,int y)
{
if(x > t[p].r || y < t[p].l)return 0;
if(x <= t[p].l && t[p].r <= y)
return t[p].v;
pushdown(p);
return (ask(2*p,x,y)%m + ask(2*p+1,x,y)%m)%m;
}
signed main()
{
scanf("%lld%lld%lld",&n,&q,&m);
for(int i = 1;i <= n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
while(q--)
{
int opt,x,y,k;
scanf("%lld%lld%lld",&opt,&x,&y);
if(opt == 1)
{
scanf("%lld",&k);
mult(1,x,y,k);
}
if(opt == 2)
{
scanf("%lld",&k);
add(1,x,y,k);
}
if(opt == 3)
{
printf("%lld\n",ask(1,x,y));
}
}
return 0;
}
样例能过,但是全WA,求助dalao们,已经调了好久了,讨论区也都看了一遍,实在是不知道错在哪,玄关QwQ