30pt求调
查看原帖
30pt求调
366316
桃雨凪丝楼主2022/7/8 17:01
#include<bits/stdc++.h>
#define I using
#define love namespace
#define me std
I love me;
typedef long long ll;
typedef double db;
#define re register int
#define ce continue
#define pf printf
#define sf scanf
#define inf 1e9+10
#define lim 100010
//#define mod 998244353
#define int ll
int gcd(int x,int y){return y?gcd(x,x%y):x;}
inline int rd(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0' || ch>'9'){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*f;
}
int n,m,mod;
int a[lim];
struct Segment_Tree{
	int l,r;
	ll sum,add,mul;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define add(x) tree[x].add
	#define mul(x) tree[x].mul
}tree[lim*4];
void build(int p,int l,int r){
	mul(p)=1;
	add(p)=0;
	l(p)=l;r(p)=r;
	if(l==r){sum(p)=a[l];return;}
	int mid=(l+r)/2;
	build(2*p,l,mid);
	build(2*p+1,mid+1,r);
	sum(p)=sum(2*p)+sum(2*p+1);
}
void spread(int p){
	sum(p*2)=(ll)(mul(p)*sum(p*2)+(add(p)*(r(p*2)-l(p*2)+1)))%mod;
    sum(p*2+1)=(ll)(mul(p)*sum(p*2+1)+(add(p)*(r(p*2+1)-l(p*2+1)+1)))%mod;
	
	mul(p*2)=(ll)(mul(p*2)*mul(p));
    mul(p*2+1)=(ll)(mul(p*2+1)*mul(p));

	add(2*p)=(ll)(add(2*p)*mul(p)+add(p))%mod;
    add(2*p+1)=(ll)(add(2*p+1)*mul(p)+add(p))%mod;
    mul(p)=1;add(p)=0;
}
void cadd(int p,int l,int r,int d){
	if(l<=l(p)&&r>=r(p)){
		sum(p)+=(ll)d*(r(p)-l(p)+1)%mod;
		add(p)+=d;
		return;	
	}
	spread(p);
	int mid=(l(p)+r(p))>>1;
	if(l<=mid)cadd(p*2,l,r,d);
	if(r>mid)cadd(p*2+1,l,r,d);
	sum(p)=(sum(p*2)+sum(p*2+1))%mod;
	
}
void cmul(int p,int l,int r,int d){
	if(l<=l(p)&&r>=r(p)){
		add(p)*=d%mod;
		sum(p)*=d%mod;
		mul(p)*=d;
		return;	
	}
	spread(p);
	int mid=(l(p)+r(p))>>1;
	if(l<=mid)cmul(p*2,l,r,d);
	if(r>mid)cmul(p*2+1,l,r,d);
	sum(p)=(sum(p*2)+sum(p*2+1))%mod;
}
ll ask(int p,int l,int r){
	if(l<=l(p)&&r>=r(p))return sum(p);
	spread(p);
	ll val=0;
	int mid=(l(p)+r(p))>>1;
	if(l<=mid)val+=ask(p*2,l,r)%mod;
	if(r>mid)val+=ask(p*2+1,l,r)%mod;
	return val;
}
signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		int op,l,r,k;
		cin>>op>>l>>r;
		if(op==1){
			cin>>k;
			cmul(1,l,r,k);
		}
		if(op==2){
			cin>>k;
			cadd(1,l,r,k);
		}	
		if(op==3){
			cout<<ask(1,l,r)%mod<<endl;	
		}
	}
	return 0;
}

2022/7/8 17:01
加载中...