求调
查看原帖
求调
1251882
123456adgj楼主2025/1/21 15:19
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,p,m,a[100001],op,b,c,k;
ll lt(ll x){return x<<1;}
ll rt(ll x){return x<<1|1;}
struct node{
	ll tag,mal,w,l,r;
}t[400001];
void up(ll x){t[x].w=t[lt(x)].w+t[rt(x)].w;}
void build(ll la,ll ra,ll x){
	t[x].mal=1,t[x].l=la,t[x].r=ra;
	if(t[x].l==t[x].r){
		t[x].w=a[la];
		return;
	}
	ll mid=la+ra>>1;
	build(la,mid,lt(x));
	build(mid+1,ra,rt(x));
	up(x);
}
void f(ll x,ll k,ll h){
	t[x].w=(t[x].w*h)%m;
	t[x].w=(t[x].w+(t[x].r-t[x].l+1)*k)%m;
	t[x].mal=(t[x].mal*h)%m;
	t[x].tag=(t[x].tag*h+k)%m;
}
void down(ll x){
	f(lt(x),t[x].tag,t[x].mal);
	f(rt(x),t[x].tag,t[x].mal);
	t[x].tag=0;
	t[x].mal=1;
}
void fx(ll x,ll k,ll h,ll la,ll ra){
	if(t[x].l>=la&&t[x].r<=ra){
		t[x].w=(t[x].w*h+(t[x].r-t[x].l+1)*k)%m;
		t[x].tag=(t[x].tag*h+k)%m;
		t[x].mal=(t[x].mal*h)%m;
		return;
	}
	down(x);
	ll mid=t[x].l+t[x].r>>1;
	if(la<=mid)fx(lt(x),k,h,la,ra);
	if(ra>mid)fx(rt(x),k,h,la,ra);
	up(x);
}
ll query(ll x,ll la,ll ra){
	if(t[x].l>=la&&t[x].r<=ra)return t[x].w;
	ll res=0;
	down(x);
	ll mid=t[x].l+t[x].r>>1;
	if(la<=mid)res=(res+query(lt(x),la,ra))%m;
	if(ra>mid)res=(res+query(rt(x),la,ra))%m;
	return res;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,n,1);
	cin>>p;
	for(int i=1;i<=p;i++){
		scanf("%d%d%d",&op,&b,&c);
		if(op==1){
			scanf("%d",&k);
			fx(1,0,k,b,c);
		}
		else if(op==2){
			scanf("%d",&k);
			fx(1,k,1,b,c);
		}
		else{
			cout<<query(1,b,c)<<endl;
		}
	}
	return 0;
}
2025/1/21 15:19
加载中...