小蒟蒻刚学OI1秒钟,求调弱弱0分代码
查看原帖
小蒟蒻刚学OI1秒钟,求调弱弱0分代码
705058
BGM114514楼主2024/8/6 20:56
#include<bits/stdc++.h>
#define int long long
#define mid (l+r)>>1
#define lc o<<1
#define rc o<<1|1
using namespace std;
const int maxn=1e5+10;
int n,q,mod,sum[4*maxn],tag[4*maxn],mtag[4*maxn],a[maxn],op,x,y,k;
inline void pushdown(int o,int l,int r){
	int m=mid;
	mtag[lc]*=mtag[o];mtag[lc]%=mod;
	mtag[rc]*=mtag[o];mtag[rc]%=mod;
	tag[lc]=tag[lc]*mtag[o]%mod+tag[o];tag[lc]%=mod;
	tag[rc]=tag[rc]*mtag[o]%mod+tag[o];tag[rc]%=mod;
	sum[lc]=mtag[o]*sum[lc]%mod+(m-l+1)*tag[o]%mod;sum[lc]%=mod;
	sum[rc]=mtag[o]*sum[rc]%mod+(r-m)*tag[o]%mod;sum[rc]%=mod;
	tag[o]=0;
	mtag[o]=1;
}
void build(int o,int l,int r){
	if(l==r){
		sum[o]=a[l]%mod;
		mtag[o]=1;
		return;
	}
	int m=mid;
	build(lc,l,m);
	build(rc,m+1,r);
	sum[o]=sum[lc]+sum[rc];sum[o]%=mod;
	mtag[o]=1;
}
void update1(int o,int l,int r){
	if(x<=l&&r<=y){
		tag[o]=(tag[o]+k)%mod;
		sum[o]=(sum[o]+(r-l+1)*k%mod)%mod;
		return;
	}
	pushdown(o,l,r);
	int m=mid;
	if(x<=m)update1(lc,l,m);
	if(y>m)update1(rc,m+1,r);
	sum[o]=sum[lc]+sum[rc];sum[o]%=mod;
}
void update2(int o,int l,int r){
	if(x<=l&&r<=y){
		tag[o]=tag[o]*k%mod;
		mtag[o]=mtag[o]*k%mod;
		sum[o]=sum[o]*k%mod;
		return;
	}
	pushdown(o,l,r);
	int m=mid;
	if(x<=m)update2(lc,l,m);
	if(y>m)update2(rc,m+1,r);
	sum[o]=sum[lc]+sum[rc];sum[o]%=mod;
}
int query(int o,int l,int r){
	if(x<=l&&r<=y){
		return sum[o]%mod;
	}
	pushdown(o,l,r);
	int m=mid,ans=0;
	if(x<=m)ans+=query(lc,l,m);
	if(y>m)ans+=query(rc,m+1,r);
	return ans%mod;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q>>mod;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(q--){
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			update1(1,1,n);
		}else if(op==2){
			cin>>x>>y>>k;
			update2(1,1,n);
		}else{
			cin>>x>>y;
			cout<<query(1,1,n)<<"\n";
		}
	}
    return 0;
}
2024/8/6 20:56
加载中...