只过了1,3,4,求调
查看原帖
只过了1,3,4,求调
1269461
2946401639q楼主2025/1/2 17:54
#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 mod(w) w%mod
using namespace std;
struct st{
	long long l,r,w,f,f2;
} 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,t[k].f2=1;
	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=mod(t[2*k].w+t[2*k+1].w);
	
}
void down(int k){
	t[2*k].w=mod(t[2*k].w+t[k].f*(t[2*k].r-t[2*k].l+1));
	t[2*k+1].w=mod(t[2*k+1].w+t[k].f*(t[2*k+1].r-t[2*k+1].l+1));
	t[2*k].f=mod(t[2*k].f+t[k].f);
	t[2*k+1].f=mod(t[2*k+1].f+t[k].f);
	t[k].f=0;
}
void down_mul(int k){
	t[2*k].w=mod(t[2*k].w*t[k].f2);
	t[2*k+1].w=mod(t[2*k+1].w*t[k].f2);
	t[2*k].f2=mod(t[2*k].f2*t[k].f2);
	t[2*k+1].f2=mod(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].f2!=1)down_mul(k);
	if(t[k].f)down(k);
	int mid=m(k);
	if(x<=mid)ans=mod(ans+a_i(2*k,x,y));
	if(y>mid)ans=mod(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=mod(t[k].w+add*(t[k].r-t[k].l+1));
		t[k].f=mod(t[k].f+add);
		return;
	}
	if(t[k].f2!=1)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=mod(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=mod(t[k].w*mul);
		t[k].f=mod(t[k].f*mul);
		t[k].f2=mod(t[k].f2*mul);
		return;
	}
	if(t[k].f2!=1)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=mod(t[2*k].w+t[2*k+1].w);
}
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)<<endl;
		}
	}
	return 0;
}
2025/1/2 17:54
加载中...