样例没过全wa求条(玄关,壶关是什么意思啊)
查看原帖
样例没过全wa求条(玄关,壶关是什么意思啊)
598652
Rui_1911楼主2025/7/21 08:21

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
#define int long long 
int n,a[N],T[N<<2],n1,z,z1,b,c,tage[N<<2],tage_x[N<<2];
long long ans1;
void build(int l,int r,int k){
	if(l==r){
		T[k]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,k*2);
	build(mid+1,r,k*2+1);
	T[k]=T[k*2]+T[k*2+1];
}
void pushdown(int l,int r,int k){
	int len=r-l+1;
	int t = tage[k];
	T[k]+=len*t;
	tage[k*2]+=t;
	tage[k*2+1]+=t;
	tage[k]=0;
}
void pushdown_x(int l,int r,int k){
	int t = tage_x[k];
	T[k]=T[k]*t;
	tage_x[k*2]+=t;
	tage_x[k*2+1]+=t;
	tage_x[k]=0;
}
void add(int l,int r,int k,int x,int y,int t){
	pushdown(l,r,k);
	pushdown_x(l,r,k);
	if(x<=l&&r<=y){
		tage[k]+=t;
		pushdown_x(l,r,k);
		pushdown(l,r,k);
		return;
	}
	if(r<x||y<l){
		return ;
	}
	int mid=(l+r)/2;
	add(l,mid,k*2,x,y,t);
	add(mid+1,r,k*2+1,x,y,t);
	T[k]=T[k*2]+T[k*2+1];
}
void mult(int l,int r,int k,int x,int y,int t){
	pushdown_x(l,r,k);
	pushdown(l,r,k);
	if(x<=l&&r<=y){
		tage_x[k]+=t;
		pushdown_x(l,r,k);
		pushdown(l,r,k);
		return;
	}
	if(r<x||y<l){
		return ;
	}
	int mid=(l+r)/2;
	mult(l,mid,k*2,x,y,t);
	mult(mid+1,r,k*2+1,x,y,t);
	T[k]=T[k*2]+T[k*2+1];
}
int sum(int l,int r,int k,int x,int y){
	int ans;
	pushdown_x(l,r,k);
	pushdown(l,r,k);
	if(x<=l&&r<=y){
		return T[k];
	}
	if(r<x||y<l){
		return 0;
	}
	int mid=(l+r)/2;
	ans=sum(l,mid,k*2,x,y)+sum(mid+1,r,k*2+1,x,y);
	T[k]=T[k*2]+T[k*2+1];
	return ans;
}
signed main(){
	int m;
	cin>>n>>n1>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
//	return 0;
	build(1,n,1);
	for(int i=1;i<=n1;i++){
		cin>>b;
		if(b==1){
			cin>>z>>z1>>c;
			mult(1,n,1,z,z1,c);
//			for(int i=1;i<=n;i++){
//			cout<<a[i]<<" ";
//		}
//		cout<<endl;
		}
		else if(b==3){
			cin>>z>>z1;
			ans1=sum(1,n,1,z,z1);
			ans1=ans1%m;
			cout<<ans1<<endl;
		}
		else{
			cin>>z>>z1>>c;
			add(1,n,1,z,z1,c);
		}
	}
	return 0;
}
2025/7/21 08:21
加载中...