WA了三个点, 没看出来哪个地方错了,请大家帮忙看一下谢谢
#include<iostream>
#define ls(s) (s << 1)
#define rs(s) ((s << 1) | 1)
using namespace std;
long long n, m, q, a[100005], laz1[400005], laz2[400005], d[400005], num, x, y, k;
//加法的laz1
void build(long long s, long long t, long long p){
laz2[p] = 1;
if(s == t) {d[p] = a[s]; return;}
else{
long long mid = s + ((t - s) >> 1);
build(s, mid, ls(p));
build(mid + 1, t, rs(p));
d[p] = (d[ls(p)] + d[rs(p)]);
}
d[p] = d[p] % m;
}
void pushdown(int p, int s, int t){
long long mid = s + ((t - s) >> 1);
d[p * 2] = (laz2[p] * d[p * 2] + (mid - s + 1) * laz1[p]) % m;
d[p * 2 + 1] = (laz2[p] * d[p * 2 + 1] + (t - mid) * laz1[p]) % m;
laz2[p * 2] = (laz2[p] * laz2[p * 2]) % m;
laz1[p * 2] = (laz1[p * 2] * laz2[p] + laz1[p]) % m;
laz2[p * 2 + 1] = (laz2[p] * laz2[p * 2 + 1]) % m;
laz1[p * 2 + 1]= (laz1[p * 2 + 1] * laz2[p] + laz1[p]) % m;
laz1[p] = 0; laz2[p] = 1;
return;
}
long long get(long long l, long long r, long long s, long long t, long long p){
if(l <= s && r >= t)return d[p];
if((laz1[p] || laz2[p])&& s != t)pushdown(p, s, t);
long long mid = s + ((t - s) >> 1);
long long sum = 0;
if(l <= mid) sum = get(l, r, s, mid, ls(p)); sum %= m;
if(r > mid) sum += get(l, r, mid + 1, t, rs(p));
return sum % m;
}
void add(long long l, long long r, long long c, long long s, long long t, long long p){
long long mid = s + ((t - s) >> 1);
if(l <= s && r >= t){
d[p] += c * (t - s + 1);
laz1[p] += c;
return;
}
if((laz1[p] || laz2[p])&& s != t)pushdown(p, s, t);
if(l <= mid)add(l, r, c, s, mid, ls(p));
if(r > mid)add(l, r, c, mid + 1, t, rs(p));
d[p] = d[ls(p)] + d[rs(p)];d[p] %= m;
}
void mul(long long l, long long r, long long c, long long s, long long t, long long p){
if(l <= s && r >= t){
d[p] = (d[p] * c) % m;
laz2[p] = (laz2[p] * c) % m;
laz1[p] = (laz1[p] * c) % m;
return;
}
if((laz1[p] || laz2[p])&& s != t)pushdown(p, s, t);
long long mid = s + ((t - s) >> 1);
if(l <= mid)mul(l, r, c, s, mid, ls(p));
if(r > mid)mul(l, r, c, mid + 1, t, rs(p));
d[p] = (d[ls(p)] + d[rs(p)]) % m;
return;
}
int main(){
// freopen("P3373_2.in", "r", stdin);
std::ios::sync_with_stdio(false);
cin>>n>>q>>m;
for(long long i = 1; i <= n; ++i)cin>>a[i];
build(1, n, 1);
while(q--){
cin>>num;
if(num == 1){
cin>>x>>y>>k;
mul(x, y, k, 1, n, 1);
}
else if(num == 2){
cin>>x>>y>>k;
add(x, y, k, 1, n, 1);
}
else{
cin>>x>>y;
cout<<get(x, y, 1, n, 1)<<"\n";
}
}
return 0;
}