30分求助,Orz大佬
查看原帖
30分求助,Orz大佬
377942
wuyadong7楼主2022/10/28 16:13
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lson p<<1
#define rson p<<1|1
const int N=1e5+10;
int n,m,mod,a[N];
struct node{
	int l,r,data,add1,add2;
}t[N*4];
void build(int p,int l,int r){
	t[p].l=l;
	t[p].r=r;
	t[p].add2=1;
	if(l==r){
		t[p].data=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(lson,l,mid);
	build(rson,mid+1,r);
	t[p].data=(t[lson].data+t[rson].data)%mod;
}
void spread(int p){
	if(t[p].add1==0&&t[p].add2==1) return ;
	t[lson].data=(t[p].add2*t[lson].data%mod+t[p].add1*(t[lson].r-t[lson].l+1))%mod;
	t[rson].data=(t[p].add2*t[rson].data%mod+t[p].add1*(t[rson].r-t[rson].l+1))%mod;
	t[lson].add1=t[lson].add1*t[p].add2+t[p].add1;
	t[rson].add1=t[rson].add1*t[p].add2+t[p].add1;
	t[lson].add2*=t[p].add2;
	t[rson].add2*=t[p].add2;
	t[lson].add2%=mod;
	t[rson].add2%=mod;
	t[p].add1=0;
	t[p].add2=1;
	return ;
}
void change1(int p,int l,int r,int k){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].add1+=k;
		t[p].add1%=mod;
		t[p].data=(t[p].data+k*(t[p].r-t[p].l+1))%mod;
		return ;
	}
	spread(p);
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) change1(lson,l,r,k);
	if(r>mid) change1(rson,l,r,k);
	t[p].data=(t[lson].data+t[rson].data)%mod;
}
void change2(int p,int l,int r,int k){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].data=t[p].data*k%mod;
		t[p].add2*=k;
		t[p].add2%=mod;
		t[p].add1*=k;
		t[p].add1%=mod;
		return ;
	}
	spread(p);
	int mid=(t[p].l+t[p].r)/2;
	if(l<=mid) change2(lson,l,r,k);
	if(mid<r) change2(rson,l,r,k);
	t[p].data=(t[lson].data+t[rson].data)%mod;
}
int query(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r) return t[p].data;
	spread(p);
	int mid=(t[p].l+t[p].r)/2;
	int ans=0;
	if(l<=mid) ans+=query(lson,l,r);
	ans%=mod;
	if(r>mid) ans+=query(rson,l,r);
	ans%=mod;
	return ans;
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		int opt;
		scanf("%lld",&opt);
		if(opt==1){
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			change2(1,x,y,k);
		}
		else if(opt==2){
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			change1(1,x,y,k);			
		}
		else{
			int x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,x,y));
		}
	}
	return 0;
}
2022/10/28 16:13
加载中...