样例过了,但全WA
有没有大佬救救孩子的
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, q, mod;
ll a[100001];
ll sum[400001];
ll jiatag[400001];
ll chengtag[400001];
void input();
void init();
void output();
void build(ll id, ll l, ll r);
void jia(ll id, ll l, ll r, ll left, ll right, ll x);
void cheng(ll id, ll l, ll r, ll left, ll right, ll x);
ll find(ll id, ll l, ll r, ll left, ll right);
void push_down(ll id, ll l, ll r);
void push_up(ll id);
int main()
{
input();
init();
build(1, 1, n);
output();
return 0;
}
void push_down(ll id, ll l, ll r)
{
ll mid = (l + r) / 2;
//由分配律得: 现sum[id*2] = (原sum[id*2] + 原jiatag[id*2])*chengtag[id] = 原sum[id*2]*chengtag[id] + 原jiatag[id*2]*chengtag[id]
//因为jiatag[id]的值是要包括乘之后的值,所以子树的jiatag[id*2]要先乘上chengtag[id]
sum[id * 2] = sum[id * 2] * chengtag[id] + jiatag[id] * (l - mid + 1);
sum[id * 2] %= mod;
chengtag[id * 2] = chengtag[id * 2] * chengtag[id];
chengtag[id * 2] %= mod;
jiatag[id * 2] = jiatag[id * 2] * chengtag[id] + jiatag[id];
jiatag[id * 2] %= mod;
sum[id * 2 + 1] = sum[id * 2 + 1] * chengtag[id] + jiatag[id] * (r - mid);
sum[id * 2 + 1] %= mod;
chengtag[id * 2 + 1] = chengtag[id * 2 + 1] * chengtag[id];
chengtag[id * 2 + 1] %= mod;
jiatag[id * 2 + 1] = jiatag[id * 2 + 1] * chengtag[id] + jiatag[id];
jiatag[id * 2 + 1] %= mod;
chengtag[id] = 1;
jiatag[id] = 0;
}
void push_up(ll id)
{
sum[id] = sum[id * 2] + sum[id * 2 + 1];
sum[id] %= mod;
}
void build(ll id, ll l, ll r)
{
if(l == r)
{
sum[id] = a[l];
return;
}
ll mid = (l + r) / 2;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
push_up(id);
}
void jia(ll id, ll l, ll r, ll left, ll right, ll x)
{
if(left <= l && r <= right)
{
sum[id] += x * (r - l + 1);
sum[id] %= mod;
jiatag[id] += x;
jiatag[id] %= mod;
return;
}
push_down(id, l, r);
ll mid = (l + r) / 2;
if(left <= mid)
{
jia(id * 2, l, mid, left, right, x);
}
if(right > mid)
{
jia(id * 2 + 1, mid + 1, r, left, right, x);
}
push_up(id);
}
void cheng(ll id, ll l, ll r, ll left, ll right, ll x)
{
if(left <= l && r <= right)
{
sum[id] *= x;
sum[id] %= mod;
jiatag[id] *= x;
jiatag[id] %= mod;
chengtag[id] *= x;
chengtag[id] %= mod;
return;
}
push_down(id, l, r);
ll mid = (l + r) / 2;
if(left <= mid)
{
cheng(id * 2, l, mid, left, right, x);
}
if(right > mid)
{
cheng(id * 2 + 1, mid + 1, r, left, right, x);
}
push_up(id);
}
ll find(ll id, ll l, ll r, ll left, ll right)
{
if(left <= l && r <= right)
{
return sum[id];
}
push_down(id, l, r);
ll mid = (l + r) / 2;
ll cnt = 0;
if(left <= mid)
{
cnt += find(id * 2, l, mid, left, right);
}
if(right > mid)
{
cnt += find(id * 2 + 1, mid + 1, r, left, right);
}
return cnt % mod;
}
void input()
{
cin >> n >> q >> mod;
for(ll i = 1; i <= n; i++)
{
cin >> a[i];
}
}
void init()
{
for(int i = 1; i <= 400000; i++)
{
chengtag[i] = 1;
}
}
void output()
{
for(ll i = 1; i <= q; i++)
{
ll op, l, r;
cin >> op >> l >> r;
if(op == 1)
{
ll x;
cin >> x;
cheng(1, 1, n, l, r, x);
}
else if(op == 2)
{
ll x;
cin >> x;
jia(1, 1, n, l, r, x);
}
else
{
cout << find(1, 1, n, l, r) << endl;
}
}
}