社区讨论

性感代码在线求调教(回复必关)

P3373【模板】线段树 2参与者 4已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@lrx97ght
此快照首次捕获于
2024/01/28 16:43
2 年前
此快照最后确认于
2024/01/28 19:08
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,q,Mod,tem,a[N],d[4*N],b[4*N],b_[4*N];
void build(ll s,ll t,ll p){
	b_[p]=1;
	if (s==t){
		d[p]=a[s]%Mod;
		return ;
	}
	ll m=s+t>>1;
	build(s,m,p*2);
	build(m+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
	d[p]%=Mod;
}
void update(ll s,ll t,ll c,ll w,ll p){
	b_[p]=(b_[p]*c)%Mod;
	b[p]=(b[p]*c)%Mod;
	b[p]=(b[p]+w)%Mod;
	d[p]=(d[p]*c+(t-s+1)*w)%Mod;
	return ;
}
void push(ll s,ll t,ll p){
	ll mid=s+t>>1;
	update(s,mid,b_[p],b[p],p*2);
	update(mid+1,t,b_[p],b[p],p*2+1); 
	b[p]=0;
	b_[p]=1;
}
void mainly(ll l,ll r,ll c,ll w,ll s,ll t,ll p){
	if (s>=l&&t<=r){
		update(s,t,c,w,p);
		return;
	}
	push(s,t,p) ;
	ll mid=s+t>>1;
	if (s<=mid) mainly(l,r,c,w,s,mid,p*2);
	if (t>mid) mainly(l,r,c,w,mid+1,t,p*2+1);
	d[p]=(d[p*2]+d[p*2+1])%Mod;
}
ll getsum(ll l,ll r,ll s,ll t,ll p){
	if (s>=l&&t<=r){
		return d[p]%Mod;
	}
	ll mid=s+t>>1;
	push(s,t,p);
	ll ans=0;
	if (mid>=l) ans=(ans+getsum(l,r,s,mid,p*2))%Mod;
	if (mid<r) ans=(ans+getsum(l,r,mid+1,t,p*2+1))%Mod;
	return ans%Mod;
}
int main(){
	scanf ("%lld%lld%lld",&n,&q,&Mod);
	for (ll i=1;i<=n;i++)
		scanf ("%lld",&a[i]);
	build(1,n,1);
	for (ll i=1;i<=q;i++){
		scanf ("%lld",&tem);
		if (tem==1){
			ll x,y,k;
			scanf ("%lld%lld%lld",&x,&y,&k);
			mainly(x,y,k,0,1,n,1);
		}
		if (tem==2){
			ll x,y,k;
			scanf ("%lld%lld%lld",&x,&y,&k);
			mainly(x,y,1,k,1,n,1);
		}
		if (tem==3){
			ll x,y;
			scanf ("%lld%lld",&x,&y);
			printf ("%lld\n",getsum(x,y,1,n,1));
		}
	}

	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...