30pts求助
查看原帖
30pts求助
1069294
Jiusan_Azurewood楼主2024/12/7 17:31
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;
#define ls u<<1
#define rs u<<1|1
struct node{
	ll l,r;
	ll sum,add,mul;
}tr[N<<2];
ll n,m,p;
ll w[N];
void pushup(ll u){
	tr[u].sum=(tr[ls].sum+tr[rs].sum)%p;
}
void eval(node &t,ll add,ll mul){
	t.sum=(t.sum*mul+(t.r-t.l+1)*add)%p;
	t.mul=(t.mul*mul)%p;
	t.add=(t.add*mul+add)%p;
}
void pushdown(ll u){
	eval(tr[ls],tr[u].add,tr[u].mul),eval(tr[rs],tr[u].add,tr[u].mul);
	tr[u].add=0,tr[u].mul=1;
}
void build(ll u,ll l,ll r){
	if(l==r) tr[u]={l,r,w[l],0,1};
	else{
		tr[u]={l,r,0,0,1};
		ll mid=l+r>>1;
		build(ls,l,mid),build(rs,mid+1,r);
		pushup(u);
	}
}
void modify(ll u,ll l,ll r,ll add,ll mul){
	if(tr[u].l>=l&&tr[u].r<=r) eval(tr[u],add,mul);
	else{
		pushdown(u);
		ll mid=tr[u].l+tr[u].r>>1;
		if(l<=mid) modify(ls,l,r,add,mul);
		if(r>mid) modify(rs,l,r,add,mul);
		pushup(u);
	}
}
ll query(ll u,ll l,ll r){
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum%p;
	pushdown(n);
	ll res=0;
	ll mid=tr[u].l+tr[u].r>>1;
	if(l<=mid) res=(res+query(ls,l,r))%p;
	if(r>mid) res=(res+query(rs,l,r))%p;
	return res;
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&p);
	for(ll i=1;i<=n;i++) scanf("%lld",&w[i]);
	build(1,1,n);
	while(m--){
		ll op;
		scanf("%lld",&op);
		if(op==1){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			modify(1,x,y,0,k);
		}else if(op==2){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			modify(1,x,y,k,1);
		}else{
			ll x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,x,y)%p);
		}
	}
	return 0;
}
2024/12/7 17:31
加载中...