不清楚是哪里出了问题 QwQ ,有没有dalao指点一下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define INF 0x3fffffff
#define N 200010
#define ll long long
#define mset(l,x) memset(l,x,sizeof(l));
#define mp(a,b) make_pair(a,b)
using namespace std;
struct Node{
ll l,r;
int ls,rs;
ll lazy_add,lazy_mul;
ll sum;
};
Node p[N * 4];
int n,m,mod;
ll cnt,a[N];
//inline int len(int k){
// return p[k].r - p[k].l + 1;
//}
inline void pushup(int k){
p[k].sum = (p[p[k].ls].sum + p[p[k].rs].sum) % mod;
}
inline void update(int k,int l,int r,int mul,int add){
(p[k].lazy_mul *= mul) %= mod;
(p[k].lazy_add *= mul) %= mod;
(p[k].lazy_add += add) %= mod;
p[k].sum = (p[k].sum * mul + (r - l + 1) * add) % mod;
if (!p[k].lazy_mul) p[k].lazy_mul = mod;
}
inline void pushdown(int k,int l,int r){
if (p[k].lazy_add || p[k].lazy_mul > 1){
ll mid = (l + r) >> 1;
update(p[k].ls,l,mid,p[k].lazy_mul,p[k].lazy_add);
update(p[k].rs,mid + 1,r,p[k].lazy_mul,p[k].lazy_add);
p[k].lazy_add = 0;
p[k].lazy_mul = 1;
}
}
inline void modify(int k,int l,int r,int x,int y,int mul,int add){
if (x <= l && r <= y){
update(k,l,r,mul,add);
return;
}
pushdown(k,l,r);
ll mid = (l + r) >> 1;
if (mid >= x)
modify(p[k].ls,l,mid,x,y,mul,add);
if (mid < y)
modify(p[k].rs,mid + 1,r,x,y,mul,add);
pushup(k);
}
inline ll query(int k,int l,int r,int x,int y){
if (x <= l && r <= y)
return p[k].sum % mod;
pushdown(k,l,r);
int mid = (l + r) >> 1;
ll ans = 0;
if (mid >= x)
(ans += query(p[k].ls,l,mid,x,y)) %= mod;
if (mid < y)
(ans += query(p[k].rs,mid + 1,r,x,y)) %= mod;
return ans;
}
inline void build(int x,int y,int k){
p[k].lazy_mul = 1;
if (x == y){
p[k].sum = a[x] % mod;
p[k].l = p[k].r = x;
return;
}
p[k].l = x,p[k].r = y;
int mid = (x + y) >> 1;
p[k].ls = cnt ++;
build(x,mid,p[k].ls);
p[k].rs = cnt ++;
build(mid + 1,y,p[k].rs);
pushup(k);
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d%d%d",&n,&m,&mod);
for (int i = 1;i <= n;i ++)
scanf("%lld",&a[i]);
cnt = 1;
build(1,n,cnt ++);
// for (int i = 0;i < cnt;i ++)
// printf("%d [%d,%d] %d %d sum:%d lazy_add:%d lazy_mul:%d\n",i,p[i].l,p[i].r,p[i].ls,p[i].rs,p[i].sum,p[i].lazy_add,p[i].lazy_mul);
while (m --){
int op,x,y,k;
scanf("%d%d%d",&op,&x,&y);
if (op == 1){
scanf("%d",&k);
modify(1,1,n,x,y,k,0);
}
else if (op == 2){
scanf("%d",&k);
modify(1,1,n,x,y,1,k);
}
else printf("%lld\n",query(1,1,n,x,y));
// for (int i = 0;i < cnt;i ++)
// printf("%d [%d,%d] %d %d sum:%d lazy_add:%d lazy_mul:%d\n",i,p[i].l,p[i].r,p[i].ls,p[i].rs,p[i].sum,p[i].lazy_add,p[i].lazy_mul);
}
// for (int i = 0;i < cnt;i ++)
// printf("%d [%d,%d] %d %d sum:%d lazy_add:%d lazy_mul:%d\n",i,p[i].l,p[i].r,p[i].ls,p[i].rs,p[i].sum,p[i].lazy_add,p[i].lazy_mul);
// fclose(stdin);
// fclose(stdout);
return 0;
}