蒟蒻代码求调(样例过,全哇
查看原帖
蒟蒻代码求调(样例过,全哇
534025
gmllsswzw楼主2022/11/21 17:04
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,q,x,y,opt;
long long k,a[N];
struct SegmentTree{
	int l,r;
	long long sum,add,mul;
	#define l(x)	t[x].l
	#define r(x)	t[x].r
	#define sum(x)	t[x].sum
	#define mul(x)	t[x].mul
	#define add(x)	t[x].add
}t[4*N];
void build(int p,int l,int r){
	l(p)=l;	r(p)=r;
	if(l==r){
		sum(p)=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(2*p,l,mid);
	build(2*p+1,mid+1,r);
	sum(p)=(sum(2*p)+sum(2*p+1))%q;
}
void spread(int p){
	sum(2*p)=(sum(2*p)*mul(p)%q+add(p))%q;
	sum(2*p+1)=(sum(2*p+1)*mul(p)%q+add(p))%q;
	add(2*p)=(add(2*p)*mul(p)%q+add(p))%q;
	add(2*p+1)=(add(2*p+1)*mul(p)%q+add(p))%q;	
	mul(2*p)=mul(2*p)*mul(p)%q;	
	mul(2*p+1)=mul(2*p+1)*mul(p)%q;
	mul(p)=1;	add(p)=0;
}
void change1(int p,int l,int r,long long k){
	if(l<=l(p)&&r>=r(p)){
		sum(p)=(sum(p)+k*(r(p)-l(p)+1))%q;
		add(p)=(add(p)+k)%q;
		return;
	}
//	cout<<"@"<<p<<" "<<add(p)<<" "<<mul(p)<<endl;
	spread(p);
	int mid=(l(p)+r(p))>>1;
	if(l<=mid)	change1(2*p,l,r,k);
	if(r>mid)	change1(2*p+1,l,r,k);
	sum(p)=(sum(2*p)+sum(2*p+1))%q;
}
void change2(int p,int l,int r,long long k){
//	cout<<"**"<<p<<endl;
	if(l<=l(p)&&r>=r(p)){
		sum(p)=sum(p)*k%q;
		mul(p)=mul(p)*k%q;
		add(p)=add(p)*k%q;
		return; 
	}
	spread(p);
	int mid=(l(p)+r(p))>>1;
	if(l<=mid)	change2(2*p,l,r,k);
	if(r>mid)	change2(2*p+1,l,r,k);
	sum(p)=(sum(p*2)+sum(p*2+1))%q;
}
long long ask(int p,int l,int r){
	if(l<=l(p)&&r>=r(p))	return sum(p);
	spread(p);
	int mid=(l(p)+r(p))>>1;
	long long val=0;
	if(l<=mid)	val+=ask(2*p,l,r);
	if(r>mid)	val+=ask(2*p+1,l,r);
	return val%q;
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=4*n;i++)
		mul(i)=1;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d",&opt);
		if(opt==1){
			scanf("%d%d%lld",&x,&y,&k);
			change2(1,x,y,k);
		}	
		else if(opt==2){
			scanf("%d%d%lld",&x,&y,&k);
			change1(1,x,y,k);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",ask(1,x,y));
		}
	}
	return 0;
}
2022/11/21 17:04
加载中...