30分求调
查看原帖
30分求调
1269461
2946401639q楼主2024/11/23 19:26
#include<bits/stdc++.h>
#define m(k) (t[k].l+t[k].r)>>1
#define ini(x,y,k) x<=t[k].l && y>=t[k].r
#define modw(k) t[k].w%=mod
using namespace std;
struct st{
	int l,r,w,f,f2=1;
} t[100100*4];
int mod;
void bu(int,int,int);
void down_mul(int);
void down(int);
long long a_i(int,int,int);
void a_d(int,int,int,int);
void m_l(int,int,int,int);
void bu(int k,int ll,int rr){
	t[k].l=ll,t[k].r=rr;
	if(ll==rr){
		cin>>t[k].w;
		return;
	}
	int mid=m(k);
	bu(2*k,ll,mid);
	bu(2*k+1,mid+1,rr);
	t[k].w=t[2*k].w+t[2*k+1].w;
}
void down(int k){
	t[2*k].w+=t[k].f*(t[2*k].r-t[2*k].l+1);
	t[2*k+1].w+=t[k].f*(t[2*k+1].r-t[2*k+1].l+1);
	modw(2*k);
	modw(2*k+1);
	t[2*k].f+=t[k].f;
	t[2*k+1].f+=t[k].f;
	t[k].f=0;
}
void down_mul(int k){
	t[2*k].w*=t[k].f2;
	modw(2*k);
	t[2*k+1].w*=t[k].f2;
	modw(2*k+1);
	t[2*k].f2*=t[k].f2;
	t[2*k+1].f2*=t[k].f2;
	t[k].f2=1;
}
long long a_i(int k,int x,int y){
	if(ini(x,y,k))return t[k].w;
	long long ans=0;
	if(t[k].f)down(k);
	int mid=m(k);
	if(x<=mid)ans+=a_i(2*k,x,y);
	if(y>mid)ans+=a_i(2*k+1,x,y);
	ans%=mod;
	return ans;
}
void a_d(int k,int x,int y,int add){
	if(ini(x,y,k)){
		t[k].w+=add*(t[k].r-t[k].l+1);
		t[k].f+=add;
		return;
	}
	if(t[k].f2)down_mul(k);
	if(t[k].f)down(k);
	int mid=m(k);
	if(x<=mid)a_d(2*k,x,y,add);
	if(y>mid)a_d(2*k+1,x,y,add);
	t[k].w=t[2*k].w+t[2*k+1].w;
}
void m_l(int k,int x,int y,int mul){
	if(ini(x,y,k)){
		t[k].w*=mul;
		t[k].f*=mul;
		t[k].f2*=mul;
		return;
	}
	if(t[k].f2)down_mul(k);
	if(t[k].f)down(k);
	int mid=m(k);
	if(x<=mid)m_l(2*k,x,y,mul);
	if(y>mid)m_l(2*k+1,x,y,mul);
	t[k].w=t[2*k].w+t[2*k+1].w;
	modw(k);
}
int main(){
	int n,m;
	cin>>n>>m>>mod;
	bu(1,1,n);
	while(m--){
		int s,x,y;
		cin>>s>>x>>y;
		if(s==1){
			int mul;
			cin>>mul;
			m_l(1,x,y,mul); 
		}
		if(s==2){
			int add;
			cin>>add;
			a_d(1,x,y,add);
		}
		if(s==3){
			cout<<a_i(1,x,y)%mod<<endl;
		}
	}
	return 0;
}

2024/11/23 19:26
加载中...