60 WA #5#6#7#8
错误信息都为:Too short on line 330.
似乎确实是先乘后加。
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int sum,add,mul=1;
}d[100005<<2];
int n,q,m;
void pushup(int p){
d[p].sum=d[p*2].sum+d[p*2+1].sum;
}
void addtag(int p,int v,int x,int len){
if(v){
d[p].mul*=x;
d[p].add*=x;
d[p].sum*=x;
d[p].mul%=m;
d[p].add%=m;
d[p].sum%=m;
}
else{
d[p].sum+=len*x;
d[p].add+=x;
d[p].add%=m;
d[p].sum%=m;
}
}
void pushdown(int p,int s,int t){
int m=s+t>>1;
if(d[p].mul!=1){
addtag(p*2,1,d[p].mul,m-s+1);
addtag(p*2+1,1,d[p].mul,t-m);
d[p].mul=1;
}
if(d[p].add){
addtag(p*2,0,d[p].add,m-s+1);
addtag(p*2+1,0,d[p].add,t-m);
d[p].add=0;
}
}
void update(int l,int r,int v,int x,int s,int t,int p){
if(l<=s&&t<=r){
addtag(p,v,x,t-s+1);
return ;
}
int m=s+t>>1;
pushdown(p,s,t);
if(l<=m)update(l,r,v,x,s,m,p*2);
if(r>m)update(l,r,v,x,m+1,t,p*2+1);
pushup(p);
}
int query(int l,int r,int s,int t,int p){
if(l<=s&&t<=r)return d[p].sum;
int m=s+t>>1,res=0;
pushdown(p,s,t);
if(l<=m)res+=query(l,r,s,m,p*2);
if(r>m)res+=query(l,r,m+1,t,p*2+1);
return res;
}
signed main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
int x ;cin>>x;
update(i,i,0,x,1,n,1);
}
// cout<<query(1,n,1,n,1)<<endl;
for(int i=1;i<=n;i++){
int mode;
cin>>mode;
if(mode==1){
int x,y,k;cin>>x>>y>>k;
update(x,y,1,k,1,n,1);
}
if(mode==2){
int x,y,k;cin>>x>>y>>k;
update(x,y,0,k,1,n,1);
}
if(mode==3){
int x,y;cin>>x>>y;
cout<<query(x,y,1,n,1)%m<<endl;
}
}
return 0;
}