线段树2求助
  • 板块学术版
  • 楼主_Kouki_
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/7/8 20:03
  • 上次更新2023/10/27 21:27:02
查看原帖
线段树2求助
364847
_Kouki_楼主2022/7/8 20:03
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int N=4*1e5+50;
ll a[N],ans[N];
ll lazy_add[N];
ll lazy_mul[N];
ll mod;

ll ls(ll x){return x<<1;}
ll rs(ll x){return x<<1|1;}
void push_up(ll p){ans[p]=ans[ls(p)]+ans[rs(p)];}

void build(ll p,ll l,ll r)
{
	lazy_add[p]=0;
	lazy_mul[p]=1;
	if(l==r){ans[p]=a[l];return;}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);	
}
void change(ll p,ll l,ll r,ll add,ll mul){
	lazy_mul[p]=(lazy_mul[p]*mul)%mod;
	lazy_add[p]=(lazy_add[p]*mul+add)%mod;
	ans[p]=(ans[p]*mul+(r-l+1)*add)%mod;
}
void push_down(ll p,ll l,ll r){
	ll mid=(l+r)>>1;
	change(ls(p),l,mid,lazy_add[p],lazy_mul[p]);
	change(rs(p),mid+1,r,lazy_add[p],lazy_mul[p]);
	lazy_add[p]=0;
	lazy_mul[p]=1;
}
void update_mul(ll nl,ll nr,ll l,ll r,ll p,ll k){
	if(nl<=l&&r<=nr){
		ans[p]=(ans[p]*k)%mod;
		lazy_add[p]=(lazy_add[p]*k)%mod;
		lazy_mul[p]=(lazy_mul[p]*k)%mod;
		return;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(nl<=mid) update_mul(nl,nr,l,mid,ls(p),k);
	if(nr>mid) update_mul(nl,nr,mid+1,r,rs(p),k);
	push_up(p);
}
void update_add(ll nl,ll nr,ll l,ll r,ll p,ll k){
	if(nl<=l&&r<=nr){
		ans[p]=(ans[p]+(r-l+1)*k)%mod;
		lazy_add[p]=(lazy_add[p]+k)%mod;
		return;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(nl<=mid) update_add(nl,nr,l,mid,ls(p),k);
	if(nr>mid) update_add(nl,nr,mid+1,r,rs(p),k);
	push_up(p);
}
ll query(ll nx,ll ny,ll l,ll r,ll p){
	ll res=0;
	if(nx<=l&&r<=ny) return ans[p];
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(nx<=mid) res=(res+query(nx,ny,l,mid,ls(p)))%p;
	if(ny>mid) res=(res+query(nx,ny,mid+1,r,rs(p)))%p;
	return res;
}
int main()
{
 	ll n,m;
 	scanf("%lld%lld%lld",&n,&m,&mod);
 	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
 	build(1,1,n);
 	while(m--){
 		ll qs;
		scanf("%lld",&qs);
		if(qs==1){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			update_mul(x,y,1,n,1,k);
		}else
		if(qs==2){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			update_add(x,y,1,n,1,k);
		}else{
			ll x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(x,y,1,n,1)%mod);
		}
	}
	return 0;
}

2022/7/8 20:03
加载中...