20pts代码求调
查看原帖
20pts代码求调
1144893
Kenneth1楼主2024/12/21 10:03

[模板]线段树1/2已过

#include <bits/stdc++.h>
using namespace std;
long long d[400010],lazy[400010],lazyx[400010],c=0;
long long a[400010];
long long a1,b1,c1,d1;
long long n,m,mod;
void pre(long long p,long long s,long long t,long long x,long long l,long long r){
	if(lazyx[p]!=1&&s!=t){
		d[p*2]*=lazyx[p]%mod;
		d[p*2]%=mod;
		lazy[p*2]*=lazyx[p]%mod;
		lazy[p*2]%=mod;
		d[p*2+1]*=lazyx[p]%mod;
		d[p*2+1]%=mod;
		lazy[p*2+1]*=lazyx[p]%mod;
		lazy[p*2+1]%=mod;
		lazyx[p*2]*=lazyx[p]%mod;
		lazyx[p*2]%=mod;
		lazyx[p*2+1]*=lazyx[p]%mod;
		lazyx[p*2+1]%=mod;
		lazyx[p]=1;
	}
	if(lazy[p]!=0&&s!=t){
		d[p*2]+=(x-l+1)*lazy[p];
		d[p*2]%=mod;
		lazy[p*2]+=lazy[p]%mod;
		lazy[p*2]%=mod;
		d[p*2+1]+=(r-x)*lazy[p]%mod;
		lazy[p*2+1]+=lazy[p]%mod;
		lazy[p]=0;
		d[p*2+1]%=mod;
		lazy[p*2+1]%=mod;
	}
}
void chen(long long s,long long t,long long l,long long r,long long p){
	if(l>=s&&r<=t){
		d[p]*=d1%mod;
		d[p]%=mod;
		lazy[p]*=d1%mod;
		lazy[p]%=mod;
		lazyx[p]*=d1%mod;
		lazyx[p]%=mod;
		return;
	}
	long long x=l+((r-l)>>1);
	pre(p,s,t,x,l,r);
	if(s<=x){
		chen(s,t,l,x,p*2);
	}
	if(t>x){
		chen(s,t,x+1,r,p*2+1);
	}
	d[p]=(d[p*2]+d[p*2+1])%mod;
}
long long find(long long s,long long t,long long l,long long r,long long p){
	if(l>=s&&r<=t){
		return d[p];
	}
	long long x=l+((r-l)>>1);
	pre(p,s,t,x,l,r);
	long long sum=0;
	if(s<=x){
		sum+=find(s,t,l,x,p*2)%mod;
		sum=sum%mod;
	}
	if(t>x){
		sum+=find(s,t,x+1,r,p*2+1)%mod;
		sum=sum%mod; 
	}
	return sum;
}
void add(long long s,long long t,long long l,long long r,long long p){
	if(l>=s&&r<=t){
		d[p]+=(r-l+1)*d1%mod;
        d[p]%=mod;
		lazy[p]+=d1;
        lazy[p]%=mod;
		return;
	}
	long long x=l+((r-l)>>1%mod);
	pre(p,s,t,x,l,r);
	if(s<=x){
		add(s,t,l,x,p*2);
	}
	if(t>x){
		add(s,t,x+1,r,p*2+1);
	}
	d[p]=(d[p*2]+d[p*2+1])%mod;
}
void build(long long s,long long e,long long p){
	lazyx[p]=1;
	if(s==e){
		d[p]=a[s];
		return;
	}
	long long x=s+((e-s)>>1);
	build(s,x,p*2);
	build(x+1,e,p*2+1);
	d[p]=(d[p*2]+d[p*2+1])%mod;
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%lld%lld",&n,&mod);
	for(long long i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		c+=a[i];
	}
	d[1]=c;
	build(1,n,1);
    cin>>m;
	for(long long i=1;i<=m;i++){
		int o=1,k=0;
		scanf("%lld%lld%lld",&a1,&b1,&c1);
		if(a1==1){
			scanf("%lld",&d1);
			chen(b1,c1,1,n,1);
		}
		if(a1==2){
			scanf("%lld",&d1);
			add(b1,c1,1,n,1);
		}
		if(a1==3){
			printf("%lld\n",find(b1,c1,1,n,1)%mod);
		}
		o=1,k=0;
	}
	return 0;
}

2024/12/21 10:03
加载中...