玄关 0分求调
查看原帖
玄关 0分求调
1144893
Kenneth1楼主2024/9/7 14:39
#include <bits/stdc++.h>
using namespace std;
long long d[401072],lazy[401072],lazyx[401072],c=0;
long long a[100010];
long long a1,b1,c1,d1;
long long n,m,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;
		lazyx[p]*=d1;
		return;
	}
	long long x=l+((r-l)>>1);
	if(lazyx[p]!=1&&s!=t){
		d[p*2]*=lazyx[p];
		lazy[p*2]*=lazyx[p];
		d[p*2+1]*=lazyx[p];
		lazy[p*2+1]*=lazyx[p];
		lazyx[p*2]*=lazyx[p];
		lazyx[p*2+1]*=lazyx[p];

		lazyx[p]=1;
	}
	if(lazy[p]!=0&&s!=t){
		d[p*2]+=(x-l+1)*lazy[p];
		lazy[p*2]+=lazy[p];
		d[p*2+1]+=(r-x)*lazy[p];
		lazy[p*2+1]+=lazy[p];
		lazy[p]=0;
	}
	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);
	if(lazyx[p]!=1&&s!=t){
		d[p*2]*=lazyx[p];
		lazy[p*2]*=lazyx[p];
		d[p*2+1]*=lazyx[p];
		lazyx[p*2]*=lazyx[p];
		lazyx[p*2+1]*=lazyx[p];
		lazy[p*2+1]*=lazyx[p];
		lazyx[p]=1;
	}
	if(lazy[p]!=0){
		d[p*2]+=(x-l+1)*lazy[p];
		lazy[p*2]+=lazy[p];
		d[p*2+1]+=(r-x)*lazy[p];
		lazy[p*2+1]+=lazy[p];
		lazy[p]=0;
	}
	long long sum=0;
	if(s<=x){
		sum=find(s,t,l,x,p*2)%mod;
	}
	if(t>x){
		sum+=find(s,t,x+1,r,p*2+1)%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;
		lazy[p]+=d1;
		return;
	}
	long long x=l+((r-l)>>1);
	if(lazyx[p]!=1&&s!=t){
		d[p*2]+=lazyx[p];
		lazy[p*2]+=lazyx[p];
		d[p*2+1]+=lazyx[p];
		lazy[p*2+1]+=lazyx[p];
		lazyx[p*2]*=lazyx[p];
		lazyx[p*2+1]*=lazyx[p];
		lazyx[p]=1;
	}
	if(lazy[p]!=0&&s!=t){
		d[p*2]+=(x-l+1)*lazy[p];
		lazy[p*2]+=lazy[p];
		d[p*2+1]+=(r-x)*lazy[p];
		lazy[p*2+1]+=lazy[p];
		lazy[p]=0;
	}
	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){
	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%lld",&n,&m,&mod);
	for(int i=1;i<=400000;i++){
			lazyx[i]=1;
			lazy[i]=0;
	}
	for(long long i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		c+=a[i];
	}
	d[1]=c;
	build(1,n,1);
	for(long long i=1;i<=m;i++){
//		int o=1,k=0;
//		cout<<endl;
//		for(long long i=1;i<=n*2-1;i++){
//			cout<<d[i]<<" ";
//			if(o==pow(2,k)){
//				k++;
//				o=0;
//				cout<<endl;
//			}
//			o++;
//		}
		cout<<endl<<endl;
		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);
		}
	}
	return 0;
}
2024/9/7 14:39
加载中...