这个线段树2的代码一直不对,我也不知道错在哪里了,都改了好些天了,求大佬指正
#include<bits/stdc++.h>
#define LCHILD(x) (x << 1)
#define RCHILD(x) (x << 1 | 1)
using namespace std;
const int MAXN = 1e5 + 1;
int op,x,y,k;
int n,m,Mod;
int a[MAXN];
struct Node
{
long long l,r;
long long multag;
long long addtag;
long long data;
}st[MAXN * 4];
void pushup(int p)
{
st[p].data = (st[LCHILD(p)].data + st[RCHILD(p)].data) % Mod;
}
void build(int p, int left, int right)
{
st[p].l = left;
st[p].r = right;
st[p].multag = 1;
st[p].addtag = 0;
if(left == right)
{
st[p].data = a[left] % Mod;
return;
}
int middle = (left + right) >> 1;
build(LCHILD(p), left, middle);
build(RCHILD(p), middle + 1, right);
pushup(p);
}
void pushdown(int p)
{
st[LCHILD(p)].data = (st[LCHILD(p)].data * st[p].multag % Mod + (st[LCHILD(p)].r - st[LCHILD(p)].l + 1) * st[p].addtag % Mod) % Mod;
st[RCHILD(p)].data = (st[RCHILD(p)].data * st[p].multag % Mod + (st[RCHILD(p)].r - st[RCHILD(p)].r + 1) * st[p].addtag % Mod) % Mod;
st[LCHILD(p)].multag = (st[p].multag * st[LCHILD(p)].multag) % Mod;
st[RCHILD(p)].multag = (st[p].multag * st[RCHILD(p)].multag) % Mod;
st[LCHILD(p)].addtag = (st[LCHILD(p)].addtag * st[p].multag % Mod + st[p].addtag) % Mod;
st[RCHILD(p)].addtag = (st[RCHILD(p)].addtag * st[p].multag % Mod + st[p].addtag) % Mod;
st[p].multag = 1;
st[p].addtag = 0;
}
void updata_mul(int p,int l,int r,long long k)
{
if(st[p].l > r || st[p].r < l) return;
if(l <= st[p].l && st[p].r <= r)
{
st[p].data = (st[p].data * k) % Mod;
st[p].addtag = (st[p].addtag * k) % Mod;
st[p].multag = (st[p].multag * k) % Mod;
return;
}
pushdown(p);
pushup(p);
updata_mul(LCHILD(p), l, r, k);
updata_mul(RCHILD(p), l, r, k);
pushup(p);
}
void updata_add(int p,int l,int r,long long k)
{
if(st[p].l > r || st[p].r < l) return;
if(l <= st[p].l && st[p].r <= r)
{
st[p].data = (st[p].data + (st[p].r - st[p].l + 1) * k) % Mod;
st[p].addtag = (st[p].addtag + k) % Mod;
return;
}
pushdown(p);
pushup(p);
updata_add(LCHILD(p), l, r, k);
updata_add(RCHILD(p), l, r, k);
pushup(p);
}
long long query(int p,int l,int r)
{
if(r < st[p].l || st[p].r < l) return 0;
if(l <= st[p].l && st[p].r <= r) return st[p].data;
pushdown(p);
return (query(LCHILD(p), l, r) + query(RCHILD(p), l, r)) % Mod;
}
int main()
{
cin >> n >> m >> Mod;
for(int i = 1;i <= n;i ++ )
{
cin >> a[i];
}
build(1,1,n);
for(int i = 1;i <= m;i ++ )
{
cin >> op;
if(op == 1)
{
cin >> x >> y >> k;
updata_mul(1,x,y,k);
}
else if(op == 2)
{
cin >> x >> y >> k;
updata_add(1,x,y,k);
}
else if(op == 3)
{
cin >> x >> y;
cout << query(1,x,y) << endl;
}
}
return 0;
}