同样的代码,一个AC,一个全WA
WA代码:
#include<iostream>
#define ll long long
#define N 100005
using namespace std;
ll n, m, p, a[N], add[N << 2], mul[N << 2];
struct node{
ll l, r, w;
}tree[N << 2];
void build(ll k, ll x, ll y){
tree[k].l = x, tree[k].r = y, mul[k] = 1;
if(x == y){
tree[k].w = a[x] % p;
return;
}
ll mid = x + y >> 1;
build(k << 1, x, mid);
build(k << 1 | 1, mid + 1, y);
tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void down(ll k, ll x, ll y){
if(!add[k] && mul[k] == 1) return;
ll mid = x + y >> 1;
tree[k << 1].w = (tree[k << 1].w * mul[k] + add[k] * (mid - x + 1) % p) % p;
tree[k << 1 | 1].w = (tree[k << 1 | 1].w * mul[k] + add[k] * (y - mid) % p) % p;
mul[k << 1] = (mul[k << 1] * mul[k]) % p;
mul[k << 1 | 1] = (mul[k << 1 | 1] * mul[k]) % p;
add[k << 1] = (add[k << 1] * mul[k] + add[k]) % p;
add[k << 1 | 1] = (add[k << 1 | 1] * mul[k] + add[k]) % p;
add[k] = 0, mul[k] = 1;
}
void Mul(ll k, ll x, ll y, ll v){
if(x <= tree[k].l && tree[k].r <= y){
add[k] *= v, add[k] %= p;
mul[k] *= v, mul[k] %= p;
tree[k].w *= v, tree[k].w %= p;
return;
}
ll mid = tree[k].l + tree[k].r >> 1;
down(k, tree[k].l, tree[k].r);
if(mid >= x) Mul(k << 1, x, y, v);
if(mid < y) Mul(k << 1 | 1, x, y, v);
tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void Add(ll k, ll x, ll y, ll v){
if(x <= tree[k].l && tree[k].r <= y){
add[k] += v, add[k] %= p;
tree[k].w += v * (tree[k].r - tree[k].l + 1), tree[k].w %= p;
return;
}
ll mid = tree[k].l + tree[k].r >> 1;
down(k, tree[k].l, tree[k].r);
if(mid >= x) Add(k << 1, x, y, v);
if(mid < y) Add(k << 1 | 1, x, y, v);
tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
ll query(ll k, ll x, ll y){
if(x <= tree[k].l && tree[k].r <= y){
return tree[k].w;
}
ll mid = tree[k].l + tree[k].r >> 1, ts = 0;
down(k, tree[k].l, tree[k].r);
if(mid >= x) ts += query(k << 1, x, y), ts %= p;
if(mid < y) ts += query(k << 1 | 1, x, y), ts %= p;
return ts;
}
int main(){
ll f, t, g, c;
scanf("%lld%lld", &n, &p);
for(int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
}
build(1, 1, n);
scanf("%lld", &m);
for(int i = 1; i <= m; i++){
scanf("%d", &f);
if(f == 1){
scanf("%lld%lld%lld", &t, &g, &c);
Mul(1, t, g, c);
}
else if(f == 2){
scanf("%lld%lld%lld", &t, &g, &c);
Add(1, t, g, c);
}
else{
scanf("%lld%lld", &t, &g);
printf("%lld\n", query(1, t, g));
}
}
return 0;
}
AC代码:
#include<iostream>
#define N 100005
#define ll long long
using namespace std;
ll n, m, p, a[N], add[N << 2], mul[N << 2];
struct node{
ll l, r, w;
}tree[N << 2];
void build(ll k, ll x, ll y){
tree[k].l = x, tree[k].r = y, mul[k] = 1;
if(x == y){
tree[k].w = a[x] % p;
return;
}
ll mid = x + y >> 1;
build(k << 1, x, mid);
build(k << 1 | 1, mid + 1, y);
tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void down(ll k, ll x, ll y){
if(!add[k] && mul[k] == 1) return;
ll mid = x + y >> 1;
tree[k << 1].w = (tree[k << 1].w * mul[k] + ((mid - x + 1) * add[k]) % p) % p;
tree[k << 1 | 1].w = (tree[k << 1 | 1].w * mul[k] + ((y - mid) * add[k]) % p) % p;
mul[k << 1] = (mul[k << 1] * mul[k]) % p;
mul[k << 1 | 1] = (mul[k << 1 | 1] * mul[k]) % p;
add[k << 1] = (add[k << 1] * mul[k] + add[k]) % p;
add[k << 1 | 1] = (add[k << 1 | 1] * mul[k] + add[k]) % p;
add[k] = 0, mul[k] = 1;
}
void Mul(ll k, ll x, ll y, ll v){
if(x <= tree[k].l && tree[k].r <= y){
add[k] = (add[k] * v) % p;
mul[k] = (mul[k] * v) % p;
tree[k].w *= v, tree[k].w %= p;
return;
}
ll mid = tree[k].l + tree[k].r >> 1;
down(k, tree[k].l, tree[k].r);
if(x <= mid) Mul(k << 1, x, y, v);
if(mid < y) Mul(k << 1 | 1, x, y, v);
tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void Add(ll k, ll x, ll y, ll v){
if(x <= tree[k].l && tree[k].r <= y){
add[k] += v, add[k] %= p;
tree[k].w += (tree[k].r - tree[k].l + 1) * v;
tree[k].w %= p;
return;
}
ll mid = tree[k].l + tree[k].r >> 1;
down(k, tree[k].l, tree[k].r);
if(x <= mid) Add(k << 1, x, y, v);
if(mid < y) Add(k << 1 | 1, x, y, v);
tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
ll query(ll k, ll x, ll y){
if(x <= tree[k].l && tree[k].r <= y) return tree[k].w;
ll mid = tree[k].l + tree[k].r >> 1, ts = 0;
down(k, tree[k].l, tree[k].r);
if(x <= mid) ts += query(k << 1, x, y), ts %= p;
if(mid < y) ts += query(k << 1 | 1, x, y), ts %= p;
return ts;
}
int main(){
ll t, g, c, f;
scanf("%lld%lld", &n, &p);
for(int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
}
build(1, 1, n);
scanf("%lld", &m);
for(int i = 1; i <= m; i++){
scanf("%lld", &f);
if(f == 1){
scanf("%lld%lld%lld", &t, &g, &c);
Mul(1, t, g, c);
}
else if(f == 2){
scanf("%lld%lld%lld", &t, &g, &c);
Add(1, t, g, c);
}
else{
scanf("%lld%lld", &t, &g);
printf("%lld\n", query(1, t, g));
}
}
return 0;
}
WA的那个代码样例过了,下载的数据也过了,就是全WA,不知为啥。。QAQ