样例过了交上去全WA,有大佬能帮忙看看吗
查看原帖
样例过了交上去全WA,有大佬能帮忙看看吗
482130
Kx_Triumphs楼主2023/8/22 13:07
#include<bits/stdc++.h>
#define ll long long
using namespace std;
//m
const int B=100005;
int n,q,m,a[B],sum[4*B],bk_mul[4*B],bk_add[4*B];
void build(int k,int l,int r){
	bk_mul[k]=1;
	bk_add[k]=0;
	if(l==r){
		sum[k]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	sum[k]=sum[k*2]+sum[k*2+1];
	return ;
}
void pushdown_add(int k,int l,int r){
	if(bk_add[k]){
		int mid=(l+r)/2,lt=k*2,rt=k*2+1;
		bk_add[lt]=(bk_add[lt]%m+bk_add[k]%m)%m;
		bk_add[rt]=(bk_add[rt]%m+bk_add[k]%m)%m;
		sum[lt]=(sum[lt]%m+bk_add[k]%m*(mid-l+1)%m)%m;
		sum[rt]=(sum[rt]%m+bk_add[k]%m*(r-(mid+1)+1)%m)%m;
		bk_add[k]=0;
		return ;
	}
}
void pushdown_mul(int k,int l,int r){
	if(bk_mul[k]!=1){
		int lt=k*2,rt=k*2+1;
		bk_mul[lt]=(bk_mul[lt]*bk_mul[k])%m;
		bk_mul[rt]=(bk_mul[rt]*bk_mul[k])%m;
		bk_add[lt]=(bk_add[lt]*bk_mul[k])%m;
		bk_add[rt]=(bk_add[rt]*bk_mul[k])%m;
		sum[lt]=(sum[lt]*bk_mul[k])%m;
		sum[rt]=(sum[rt]*bk_mul[k])%m;
		bk_mul[k]=1;
		return ;
	}
}
void change_add(int k,int l,int r,int x,int y,int v){
	if(r<x||l>y){
		return ;
	}
	if(x<=l&&r<=y){
		sum[k]+=v*(r-l+1)%m;
		bk_add[k]+=v;
		return ;
	}
	pushdown_mul(k,l,r);
	pushdown_add(k,l,r);
	int mid=(l+r)/2;
	change_add(k*2,l,mid,x,y,v);
	change_add(k*2+1,mid+1,r,x,y,v);
	sum[k]=sum[k*2]+sum[k*2+1];
	return ;
}
void change_mul(int k,int l,int r,int x,int y,int v){
	if(r<x||l>y){
		return ;
	}
	if(x<=l&&r<=y){
		sum[k]=(sum[k]*v)%m;
		bk_add[k]=(bk_add[k]*v)%m;
		bk_mul[k]=(bk_mul[k]*v)%m;
		return ;
	}
	pushdown_mul(k,l,r);
	pushdown_add(k,l,r);
	int mid=(l+r)/2;
	change_mul(k*2,l,mid,x,y,v);
	change_mul(k*2+1,mid+1,r,x,y,v);
	sum[k]=sum[k*2]+sum[k*2+1];
	return ;
}
ll query(int k,int l,int r,int x,int y){
	if(r<x||l>y){
		return 0;
	}
	if(x<=l&&r<=y){
		return sum[k];
	}
	ll mid=(l+r)/2,ans=0;
	pushdown_mul(k,l,r);
	pushdown_add(k,l,r);
	ans=ans+query(k*2,l,mid,x,y);
	ans=ans+query(k*2+1,mid+1,r,x,y);
	return ans;
}
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int c;
		cin>>c;
		if(c==1){
			int x,y,k;
			cin>>x>>y>>k;
			change_mul(1,1,n,x,y,k);
		}
		else if(c==2){
			int x,y,k;
			cin>>x>>y>>k;
			change_add(1,1,n,x,y,k); 
		}
		else if(c==3){
			int x,y;
			cin>>x>>y;
			cout<<query(1,1,n,x,y)%m<<endl;
		}
	}
	
	return 0;
}
/*
5 5 38
1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
*/
2023/8/22 13:07
加载中...