是不是区间乘法错了?求助
#include <bits/stdc++.h>
using namespace std;
const long long N = 1e5 + 5;
long long n, m, p;
long long x, y, k, q;
long long a[N], d[N << 2], b[N << 2], v[N << 2];
void build(long long l, long long r, long long root){
if(l == r){
d[root] = a[l] % p;
return;
}
long long m = l + ((r - l) >> 1);
build(l, m, root * 2);
build(m + 1, r, root * 2 + 1);
d[root] = (d[root << 1] % p + d[(root << 1) + 1] % p) % p;
}
long long getsum(long long l, long long r, long long s, long long t, long long root){
if(l <= s && t <= r)
return d[root] % p;
long long m = s + ((t - s) >> 1);
if(b[root]){
d[root * 2] += b[root] * (m - s + 1) % p;
d[root * 2 + 1] += b[root] * (t - m) % p;
d[root * 2] %= p;
d[root * 2 + 1] %= p;
b[root * 2] += b[root] % p;
b[root * 2 + 1] += b[root] % p;
b[root * 2] %= p;
b[root * 2 + 1] %= p;
b[root] = 0;
}
long long sum = 0;
if(l <= m){
sum += getsum(l, r, s, m, root * 2) % p;
sum %= p;
}
if(r > m) {
sum += getsum(l, r, m + 1, t, root * 2 + 1) % p;
sum %= p;
}
return sum;
}
void update(long long l, long long r, long long c, long long s, long long t, long long root){
if(l <= s && t <= r){
d[root] += (t - s + 1) * c;
b[root] += c;
d[root] %= p;
b[root] %= p;
return;
}
long long m = s + ((t - s) >> 1);
if(b[root] && s != t) {
d[root * 2] += b[root] * (m - s + 1) % p;
d[root * 2 + 1] += b[root] * (t - m) % p;
d[root * 2] %= p;
d[root * 2 + 1] %= p;
b[root * 2] += b[root] % p;
b[root * 2 + 1] += b[root] % p;
b[root * 2] %= p;
b[root * 2 + 1] %= p;
b[root] = 0;
}
if(l <= m)
update(l, r, c, s, m, root * 2);
if(r > m)
update(l, r, c, m + 1, t, root * 2 + 1);
d[root] = (d[root * 2] % p + d[root * 2 + 1] % p) % p;
}
void update2(long long l, long long r, long long c, long long s, long long t, long long root){
if(l <= s && t <= r){
d[root] *= c;
v[root] *= c;
b[root] *= c;
return;
}
long long m = s + ((t - s) >> 1);
if(v[root] != 1 && s != t) {
d[root * 2] += b[root] * (m - s + 1) % p;
d[root * 2 + 1] += b[root] * (t - m) % p;
d[root * 2] %= p;
d[root * 2 + 1] %= p;
v[root * 2] *= v[root] % p;
v[root * 2 + 1] *= v[root] % p;
v[root * 2] %= p;
v[root * 2 + 1] %= p;
b[root * 2] = (b[root * 2] * v[root] + b[root]) % p;
b[root * 2 + 1] = (b[root * 2 + 1] * v[root] + b[root]) % p;
b[root * 2] %= p;
b[root * 2 + 1] %= p;
v[root] = 1;
b[root] = 0;
}
if(l <= m)
update2(l, r, c, s, m, root * 2);
if(r > m)
update2(l, r, c, m + 1, t, root * 2 + 1);
d[root] = (d[root * 2] % p + d[root * 2 + 1] % p) % p;
}
int main(){
cin >> n >> m >> p;
for(long long i = 1; i <= n; ++i)
cin >> a[i];
build(1, n, 1);
memset(v, 1, sizeof(v));
for(long long i = 1; i <= m; ++i){
cin >> q;
if(q == 1){
cin >> x >> y >> k;
update2(x, y, k, 1, n, 1);
}
else if(q == 2){
cin >> x >> y >> k;
update(x, y, k, 1, n, 1);
}
else{
cin >> x >> y;
cout << getsum(x, y, 1, n, 1) % p << endl;
}
}
return 0;
}