求助线段树爆0
查看原帖
求助线段树爆0
793625
Pink_Cut_Tree楼主2023/12/21 19:17
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define ll long long
#define ls(x) x*2
#define rs(x) x*2+1
int n,q,mod,a[N],op,x,y,k;
ll w[4*N],add[4*N],mul[4*N],siz[4*N];
void pushup(int u){
	siz[u]=siz[ls(u)]+siz[rs(u)];
	w[u]=(w[ls(u)]+w[rs(u)])%mod;
}
void build(int u,int l,int r){
	if(l==r){
		w[u]=a[l];
		siz[u]=1;
		return;
	}
	int mid=(l+r)/2;
	build(ls(u),l,mid);
	build(rs(u),mid+1,r);
	pushup(u);
}
void pushdown(int u){
	if(mul[u]){
		w[ls(u)]*=siz[ls(u)]*mul[u]; w[ls(u)]%=mod;
		w[rs(u)]*=siz[rs(u)]*mul[u]; w[rs(u)]%=mod;
		mul[ls(u)]*=mul[u];  
		mul[rs(u)]*=mul[u];
		mul[u]=1;
	}
	if(add[u]){ 
		w[ls(u)]+=siz[ls(u)]*add[u]; w[ls(u)]%=mod;
		w[rs(u)]+=siz[rs(u)]*add[u]; w[rs(u)]%=mod;
		add[ls(u)]+=add[u]; 
		add[rs(u)]+=add[u];
		add[u]=0;
	}
} 
void modify(int u,int l,int r,int L,int R,int x,int op){
	if(l>=L&&r<=R){
		w[u]*=x*siz[u]; w[u]%=mod;
		add[u]*=x; add[u]%=mod;
		if(op==1){
			mul[u]*=x; mul[u]%=mod;
		}
	}
	else if(!(l>R||r<L)){ 
		pushdown(u); 
		int mid=(l+r)/2;
		modify(ls(u),l,mid,L,R,x,op);
		modify(rs(u),mid+1,r,L,R,x,op);
		pushup(u);
	}
}
ll qry(int u,int l,int r,int L,int R){ 
	if(l>=L&&r<=R){ 
		return w[u];
	}
	else if(!(l>R||r<L)){ 
		pushdown(u); 
		int mid=(l+r)/2;
		return qry(ls(u),l,mid,L,R)+qry(rs(u),mid+1,r,L,R); 
	}
return 0;
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>q>>mod;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=4*n;i++){
		mul[i]=1;
	}
	while(q--){
		cin>>op>>x>>y;
		if(op<=2){
			cin>>k;
			modify(1,1,n,x,y,k,op);
		}
		else{
			cout<<qry(1,1,n,x,y)<<"\n";
		}
	} 
return 0;
}
2023/12/21 19:17
加载中...