本地样例,自己编的样例都能过,结果全wa
球球dailao看看问题出在哪里
#include <bits/stdc++.h>
using namespace std;
#define size1 100005
#define ll long long
#define inf 0
struct node {
ll l, r;
ll s, d;
ll dt = 1;
} t[size1 * 4];
int n, q, m;
ll a[size1];
void build(int p, int l, int r) {
t[p].l = l, t[p].r = r;
if (l == r) {
t[p].s = a[l];
return ;
}
int mid = (l + r) / 2;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
t[p].s = t[2 * p].s + t[2 * p + 1].s;
}
void spread(int p) {
if (!t[p].d || !t[p].dt) return;
for (int i = 0; i <= 1; i++) {
t[2 * p + i].s += (t[2 * p + i].r - t[2 * p + i].l + 1) * t[p].d;
if (t[p].dt != 1)
t[2 * p + i].s = t[2 * p + i].s * (t[p].dt) % m;
if (t[2 * p + i].l != t[2 * p + i].r) {
t[2 * p + i].d += t[p].d;
t[2 * p + i].dt = t[2 * p + i].dt * t[p].dt % m;
}
}
t[p].d = 0;
t[p].dt = 1;
}
void changea(int p, int l, int r, int x) {
if (l <= t[p].l && r >= t[p].r) {
t[p].s += (t[p].r - t[p].l + 1) * x % m;
if (t[p].l != t[p].r) t[p].d = t[p].d + x;
return;
}
else if (l > t[p].r || r < t[p].l) return;
spread(p);
changea(2 * p, l, r, x);
changea(2 * p + 1, l, r, x);
t[p].s = t[2 * p].s + t[2 * p + 1].s;
}
void changet(int p, int l, int r, int x) {
if (l <= t[p].l && r >= t[p].r) {
if (x != 1)
t[p].s = t[p].s * (x) % m;
if (t[p].l != t[p].r) t[p].dt *= x;
return;
}
else if (l > t[p].r || r < t[p].l) return;
changet(2 * p, l, r, x);
changet(2 * p + 1, l, r, x);
t[p].s = (t[2 * p].s + t[2 * p + 1].s) % m;
}
ll ask(int p, int l, int r) {
if (l <= t[p].l && r >= t[p].r) return t[p].s;
else if (l > t[p].r || r < t[p].l) return 0;
spread(p);
return (ask(2 * p, l, r) + ask(2 * p + 1, l, r)) % m;
}
int main() {
freopen("segmenttree.in" , "r", stdin);
freopen("segmenttree.out", "w", stdout);
scanf("%d%d%d", &n, &q, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
build(1, 1, n);
for (int i = 1; i <= q; i++) {
int opt, x, y, z;
scanf("%d%d%d", &opt, &x, &y);
if (opt == 1) {
scanf("%d", &z);
changet(1, x, y, z);
}
else if (opt == 2) {
scanf("%d", &z);
changea(1, x, y, z);
}
else printf("%d\n", ask(1, x, y));
}
}