码风良好,然后全屏 WA,求助大佬们。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100010;
int n,q,mod,value[N],opt,x,y,z;
struct SegmentTree{
int l,r;
int sum,add,mul;
}tree[N<<2];
void push_up(int u){
tree[u].sum=tree[u<<1].sum+tree[u<<1|1].sum;
}
void push_down(int u){
auto &root=tree[u],&lson=tree[u<<1],&rson=tree[u<<1|1];
if(root.mul){
lson.mul+=root.mul,lson.sum*=root.mul;
rson.mul+=root.mul,rson.sum*=root.mul;
root.mul=0;
}
if(root.add){
lson.add+=root.add,lson.sum+=(lson.r-lson.l+1)*root.add;
rson.add+=root.add,rson.sum+=(rson.r-rson.l+1)*root.add;
root.add=0;
}
}
void build(int u,int l,int r){
if(l==r){tree[u]={l,r,value[l],0,0};return ;}
else{
tree[u].l=l,tree[u].r=r;
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
push_up(u);
}
}
void modify_add(int u,int l,int r,int x){
if(tree[u].l>=l&&tree[u].r<=r){
tree[u].sum+=(tree[u].r-tree[u].l+1)*x;
tree[u].add+=x;
return ;
}
else{
push_down(u);
int mid=tree[u].l+tree[u].r>>1;
if(l<=mid) modify_add(u<<1,l,r,x);
if(r>mid) modify_add(u<<1|1,l,r,x);
push_up(u);
}
}
void modify_mul(int u,int l,int r,int x){
if(tree[u].l>=l&&tree[u].r<=r){
tree[u].sum*=x;
tree[u].mul+=x;
return ;
}
else{
push_down(u);
int mid=tree[u].l+tree[u].r>>1;
if(l<=mid) modify_mul(u<<1,l,r,x);
if(r>mid) modify_mul(u<<1|1,l,r,x);
push_up(u);
}
}
int query(int u,int l,int r){
if(tree[u].l>=l&&tree[u].r<=r) return tree[u].sum;
else{
push_down(u);
int mid=tree[u].l+tree[u].r>>1,res=0;
if(l<=mid) res+=query(u<<1,l,r);
if(r>mid) res+=query(u<<1|1,l,r);
return res%mod;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>mod;
for(int i=1;i<=n;i++) cin>>value[i];
build(1,1,n);
cin>>q;
while(q--){
cin>>opt>>x>>y;
if(opt==1){
cin>>z;
modify_mul(1,x,y,z);
}
else if(opt==2){
cin>>z;
modify_add(1,x,y,z);
}
else cout<<query(1,x,y)%mod<<"\n";
}
return 0;
}