这里是一颗hsao的线段树,求调%
查看原帖
这里是一颗hsao的线段树,求调%
788202
water_monster楼主2023/7/19 11:23
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=1e5+1;
ll n,q,mod,x,y,k,num;
ll a[M];
struct tree{
	ll date,l,r;
	ll ts,tm;
}t[M<<2];
ll ls(ll p){
	return p<<1;
}
ll rs(ll p){
	return p<<1|1;
}
void push_up(ll p){
	t[p].date=t[ls(p)].date+t[rs(p)].date;
}
void addt(ll p,ll add,ll mul){
	t[p].date=t[p].date*mul%mod+(t[p].r-t[p].l+1)*add%mod;
	t[p].tm*=mul%mod;
	t[p].ts=t[p].ts%mod*mul%mod+add%mod;
}
void push_down(ll p){
	addt(ls(p),t[p].ts,t[p].tm);
	addt(rs(p),t[p].ts,t[p].tm);
	t[p].ts=0,t[p].tm=1;
}
void build(ll p,ll l,ll r){
	t[p].l=l,t[p].r=r,t[p].tm=1;
	if(l==r){
		t[p].date=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
void update(ll p,ll l,ll r,ll w,ll flag){
	if(l<=t[p].l&&t[p].r<=r){
		if(flag){
			addt(p,w,1);
			return;
		}else{
			addt(p,0,w);
			return;
		}
	}
	if(t[p].l!=t[p].r) push_down(p);
	ll mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) update(ls(p),l,r,w,flag);
	if(mid<r) update(rs(p),l,r,w,flag);
	push_up(p);
}
ll query(ll p,ll l,ll r){
	if(l<=t[p].l&&t[p].r<=r){
		return t[p].date;
	}
	if(t[p].l!=t[p].r) push_down(p);
	ll mid=(t[p].l+t[p].r)>>1;
	ll sum=0;
	if(l<=mid) sum+=query(ls(p),l,r);
	if(mid<r) sum+=query(rs(p),l,r);
	return sum;
}
int main(){
	scanf("%lld%lld%lld",&n,&q,&mod);
	for(ll i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(ll i=1;i<=q;i++){
		scanf("%lld%lld%lld",&num,&x,&y);
		if(num==1){
			scanf("%lld",&k);
			update(1,x,y,k,1);
		}else if(num==2){
			scanf("%lld",&k);
			update(1,x,y,k,0);
		}else{
			ll ans=query(1,x,y)%mod;
			printf("%lld\n",ans);
		}
	}
	return 0;
}

帮帮帮帮

2023/7/19 11:23
加载中...