样例都过不了,输出15和30,写了两个不同的板子都是这样。求解啊
//板子一
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
LL n,q,m,a[N];
struct Node{
LL val,mul,add;
}tree[N * 4];
void build(LL l = 1, LL r = n, LL p = 1)
{
tree[p].add = 0;
tree[p].mul = 1;
if(l == r)
{
tree[p].val = a[l];
}
else
{
LL mid = (l + r) / 2;
build(l, mid, p * 2);
build(mid + 1, r, p * 2 + 1);
tree[p].val = (tree[p * 2].val + tree[p * 2 + 1].val) % m;
}
tree[p].val %= m;
}
void push_down(LL p,LL len)
{
tree[p * 2].val = (tree[p * 2].val * tree[p].mul + tree[p].add * (len - (len / 2))) % m;
tree[p * 2 + 1].val = (tree[p * 2 + 1].val * tree[p].mul + tree[p].add * (len / 2)) % m;
tree[p * 2].mul = (tree[p * 2].mul * tree[p].mul) % m;
tree[p * 2 + 1].mul = (tree[p * 2 + 1].mul * tree[p].mul) % m;
tree[p * 2].add = (tree[p * 2].add * tree[p].mul + tree[p].add) % m;
tree[p * 2 + 1].add = (tree[p * 2 + 1].add * tree[p].mul + tree[p].add) % m;
tree[p].mul = 1;
tree[p].add = 0;
}
void upda1(LL l, LL r, LL d, LL cl = 1, LL cr = n, LL p = 1)
{
if(l > cr || r < cl) return;
else if(cl >= l && cr <= r)
{
tree[p].val = (tree[p].val * d) % m;
if(cl > cr)
{
tree[p].mul = (tree[p].mul * d) % m;
tree[p].add = (tree[p].add * d) % m;
}
}
else
{
LL mid = (cl + cr) / 2;
push_down(p,cr - cl + 1);
upda1(l,r,d,cl,mid,p * 2);
upda1(l,r,d,mid + 1,cr,p * 2 + 1);
tree[p].val = (tree[p * 2].val + tree[p * 2 + 1].val) % m;
}
}
void upda2(LL l,LL r,LL d,LL cl = 1,LL cr = n,LL p = 1)
{
if(l > cr || r < cl) return;
else if(cl >= l && cr <= r)
{
tree[p].val = (tree[p].val + d * (cr - cl + 1)) % m;
if(cl > cr) tree[p].add = (tree[p].add + d) % m;
}
else
{
LL mid = (cr + cl) / 2;
push_down(p,cr - cl + 1);
upda2(l,r,d,cl,mid,p * 2);
upda2(l,r,d,mid + 1,cr,p * 2 + 1);
tree[p].val = (tree[p * 2].val + tree[p * 2 + 1].val) % m;
}
}
LL query(LL l,LL r,LL cl = 1,LL cr = n, LL p = 1)
{
if(l > cr || r < cl) return 0;
else if(cl >= l && cr <= r)
{
return tree[p].val;
}
else
{
LL mid = (cl + cr) / 2;
push_down(p,cr - cl + 1);
return (query(l,r,cl,mid,p * 2) + query(l,r,mid + 1,cr,p * 2 + 1)) % m;
}
}
int main()
{
cin>>n>>q>>m;
for(int i = 1; i <= n; i++) cin>>a[i];
build();
while(q--)
{
int op;
LL l,r,k;
cin>>op;
if(op == 1)
{
cin>>l>>r>>k;
upda1(l,r,k);
}
else if(op == 2)
{
cin>>l>>r>>k;
upda2(l,r,k);
}
else
{
cin>>l>>r;
LL ans = query(l,r);
cout<<ans<<endl;
}
}
}
分割线————————————————————
//板子二
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
LL add[N * 4],mul[N * 4],a[N * 4],tree[N * 4];
LL n,q,m;
void build(LL l = 1,LL r = n,LL p = 1)
{
mul[p] = 1;
add[p] = 0;
if(l == r)
{
tree[p] = a[l];
}
else
{
LL mid = (l + r) / 2;
build(l, mid, p * 2);
build(mid + 1, r, p * 2 + 1);
tree[p] = (tree[p * 2] + tree[p * 2 + 1]);
}
tree[p] %= m;
}
void push_down(LL p, LL len)
{
tree[p * 2] = (tree[p * 2] * mul[p] + add[p] * (len - (len / 2))) % m;
tree[p * 2 + 1] = (tree[p * 2 + 1] * mul[p] + add[p] * (len / 2)) % m;
mul[p * 2] = (mul[p * 2] * mul[p]) % m;
mul[p * 2 + 1] = (mul[p * 2 + 1] * mul[p]) % m;
add[p * 2] = (add[p * 2] * mul[p] + add[p]) % m;
add[p * 2 + 1] = (add[p * 2 + 1] * mul[p] + add[p]) % m;
mul[p] = 1;
add[p] = 0;
}
void upd1(LL l, LL r, LL d, LL cl = 1, LL cr = n, LL p = 1)
{
if(l > cr || r < cl) return;
else if(cl >= l && cr <= r)
{
if(cl > cr)
{
mul[p] = (mul[p] * d) % m;
add[p] = (add[p] * d) % m;
}
tree[p] = (tree[p] * d) % m;
}
else
{
LL mid = (cl + cr) / 2;
push_down(p, cr - cl + 1);
upd1(l,r,d,cl,mid,p * 2);
upd1(l,r,d,mid + 1,cr,p * 2 + 1);
tree[p] = (tree[p * 2] + tree[p * 2 + 1]) % m;
}
}
void upd2(LL l,LL r,LL d,LL cl = 1,LL cr = n, LL p = 1)
{
if(l > cr || r < cl) return;
else if(cl >= l && cr <= r)
{
if(cl > cr) add[p] = (add[p] + d) % m;
tree[p] = (tree[p] + d * (cr - cl + 1)) % m;
}
else
{
LL mid = (cl + cr) / 2;
push_down(p,cr - cl + 1);
upd2(l,r,d,cl,mid,p * 2);
upd2(l,r,d,mid + 1,cr,p * 2 + 1);
tree[p] = (tree[p * 2] + tree[p * 2 + 1]) % m;
}
}
LL query(LL l, LL r, LL cl = 1, LL cr = n, LL p = 1)
{
if(l > cr || r < cl) return 0;
else if(cl >= l && cr <= r)
{
return tree[p];
}
else
{
LL mid = (cl + cr) / 2;
push_down(p,cr - cl + 1);
return (query(l,r,cl,mid,p * 2) + query(l,r,mid + 1,cr,p * 2 + 1)) % m;
}
}
int main()
{
cin>>n>>q>>m;
for(int i = 1; i <= n; i++) cin>>a[i];
build();
while(q--)
{
int op;
LL x,y,k;
cin>>op;
if(op == 1)
{
cin>>x>>y>>k;
upd1(x,y,k);
}
else if(op == 2)
{
cin>>x>>y>>k;
upd2(x,y,k);
}
else
{
cin>>x>>y;
LL ans = query(x,y);
cout<<ans<<endl;
}
}
}
求解求解呜呜呜~~