60 WA #5#6#7#8求调
查看原帖
60 WA #5#6#7#8求调
343531
xiaosi4081楼主2023/12/29 14:15

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;
}
2023/12/29 14:15
加载中...