WA,0分,向各位求助,谢谢! 其中#1点把 562114 错误输成 317199
#include <cstdio>
using namespace std;
const int N = 1e5;
typedef long long ll;
ll arr[N], sum[N << 2], add[N << 2], mul[N << 2];
//int L[N << 2], R[N << 2];
ll mod;
inline void pushUp(int i)
{
sum[i] = (sum[i << 1] + sum[i << 1 | 1]) % mod;
}
void pushDownAdd(int i, int l, int m, int r)
{
if (l == r)
{
return;
}
(add[i << 1] += add[i]) %= mod;
(add[i << 1 | 1] += add[i]) %= mod;
(sum[i << 1] += add[i] * (m - l + 1)) %= mod;
(sum[i << 1 | 1] += add[i] * (r - m)) %= mod;
add[i] = 0;
}
void pushDownMul(int i, int l, int m, int r)
{
if (l == r)
{
return;
}
(mul[i << 1] *= mul[i]) %= mod;
(mul[i << 1 | 1] *= mul[i]) %= mod;
(sum[i << 1] *= mul[i]) %= mod;
(sum[i << 1 | 1] *= mul[i]) %= mod;
mul[i] = 1;
}
void pushDown(int i, int l, int m, int r)
{
pushDownMul(i, l, m, r);
pushDownAdd(i, l, m, r);
}
void build(int i, int l, int r)
{
// L[i] = l;
// R[i] = r;
mul[i] = 1;
if (l == r)
{
sum[i] = arr[l];
return;
}
int mid = (l + r) >> 1;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushUp(i);
}
void addVal(int i, int al, int ar, int l, int r, ll val)
{
int mid = (l + r) >> 1;
pushDown(i, l, mid, r);
if (al <= l && r <= ar)
{
(add[i] += val) %= mod;
(sum[i] += (r - l + 1) * val) %= mod;
return;
}
if (mid >= al)
{
addVal(i << 1, al, ar, l, mid, val);
}
if (mid + 1 <= ar)
{
addVal(i << 1 | 1, al, ar, mid + 1, r, val);
}
pushUp(i);
}
void mulVal(int i, int al, int ar, int l, int r, ll val)
{
int mid = (l + r) >> 1;
pushDownAdd(i, l, mid, r);
if (al <= l && r <= ar)
{
(mul[i] *= val) %= mod;
(sum[i] *= val) %= mod;
return;
}
if (mid >= al)
{
mulVal(i << 1, al, ar, l, mid, val);
}
if (mid + 1 <= ar)
{
mulVal(i << 1 | 1, al, ar, mid + 1, r, val);
}
pushUp(i);
}
ll query(int i, int ql, int qr, int l, int r)
{
if (ql <= l && r <= qr)
{
// printf("222222\nquery()::ans was added by [%d,%d] : sum=%d\n22222222\n", l, r, sum[i]);
return sum[i];
}
int mid = (l + r) >> 1;
pushDown(i, l, mid, r);
ll ans = 0;
if (mid >= ql)
{
ans = (ans + query(i << 1, ql, qr, l, mid)) % mod;
}
if (mid + 1 <= qr)
{
ans = (ans + query(i << 1 | 1, ql, qr, mid + 1, r)) % mod;
}
pushUp(i);
return ans;
}
void print(int n, const char* str)
{
for (int i = 1; i <= n; ++i)
{
// printf("[%d~%d] : (s=%lld, a=%lld, m=%lld)\n",
// L[i], R[i], sum[i], add[i], mul[i]);
}
printf(str);
}
int main()
{
// freopen("P3373.in", "r", stdin);
// freopen("P3373.out", "w", stdout);
int n, m, t, l, r;
ll val;
scanf("%d%d%lld", &n, &m, &mod);
for (int i = 1; i <= n; ++i)
{
scanf("%lld", &arr[i]);
arr[i] %= mod;
}
build(1, 1, n);
// print(n << 2, "========\n");
while (m--)
{
scanf("%d%d%d", &t, &l, &r);
if (t == 1)
{
scanf("%lld", &val);
mulVal(1, l, r, 1, n, val);
}
else if (t == 2)
{
scanf("%lld", &val);
addVal(1, l, r, 1, n, val);
}
else
{
printf("%lld\n", query(1, l, r, 1, n));
}
// print(n << 2, "11111111111111\n");
}
}
经过我自己用打log等方式调试,怀疑是乘法(或乘法时的 pushDown 操作不对),请求各位帮助,谢谢!