求助【包0的】
查看原帖
求助【包0的】
1293987
zhangruixiang楼主2025/1/13 19:39

#1#2#3...#10[WA]\color{red}{\#1\#2\#3...\to\#10 [WA]}
%%%DALAO\LARGE\%\%\%DALAO

***
#include<bits/stdc++.h>
#define int long long
#define _ %P
#define endl '\n'
#define reset t[id].add=0;t[id].mul=1
using namespace std;
int P;
inline int read(){
	int res=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar();}
	while(isdigit(ch)){ res=res*10+ch-48; ch=getchar();}
	return res*f;
}
const int maxn=100000+10;
struct Node{
	int L,R;
	int sum,add,mul;
} t[maxn*4+1];
int n,a[maxn];
void up(int id){
	t[id].sum=t[id*2].sum+t[id*2+1].sum;
}
void down(int id){//处理编号id的为标记,下传给它的儿子
	//LEFTs_id=id*2
	//RIGHTs_id=id*2+1
	t[id*2].add=t[id*2].add*t[id].mul+t[id].add; 
	t[id*2+1].add=t[id*2+1].add*t[id].mul+t[id].add;
	t[id*2].sum=(t[id*2].sum*t[id].mul+(t[id*2].R-t[id*2].L+1)*t[id].add _)_;
	t[id*2+1].sum=(t[id*2+1].sum*t[id].mul+(t[id*2+1].R-t[id*2+1].L+1)*t[id].add _)_;
	
	t[id*2].mul*=t[id].mul;
	t[id*2+1].mul*=t[id].mul;
	
	reset;
}
void build(int id,int l,int r){//新建一个节点,编号为id,左端点为l,右端点为r
	t[id].L=l; t[id].R=r;
	if(l==r){//节点表示的区间为一个点,递归边界
		t[id].sum=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid); build(id*2+1,mid+1,r);
	up(id);
}
void update(int id,int l,int r,int val,string s){//将l,r区间同时加上一个val
	if(s=="mul"){//mul标记
		if(t[id].L>r || t[id].R<l) return;
		if(t[id].L>=l && t[id].R<=r){//节点自己处理
			t[id].add*=val;t[id].add _;
			t[id].mul*=val;t[id].mul _;
			t[id].sum*=val;t[id].sum _;
			return;
		}
		down(id);
		t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
		int mid=(t[id].R+t[id].L)>>1;
		if(l<=mid)update(id*2,l,r,val,s);
		if(mid<r)update(id*2+1,l,r,val,s);
		t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
	}
	else{//add标记
		if(t[id].L>r || t[id].R<l) return;
		if(t[id].L>=l && t[id].R<=r){//节点自己处理
			t[id].add+=val;t[id].add _;
			t[id].sum+=(t[id].R-t[id].L+1)*val;t[id].sum _;
			return;
		}
		down(id);
		t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
		int mid=(t[id].R+t[id].L)>>1;
		if(l<=mid)update(id*2,l,r,val,s);
		if(mid<r)update(id*2+1,l,r,val,s);
		t[id].sum=(t[id*2].sum+t[id*2+1].sum) _;
	}
	
}
int ask_sum(int id,int l,int r){
	if(t[id].L>r || t[id].R<l) return 0;
	if(t[id].L>=l && t[id].R<=r) return t[id].sum;
	down(id);
	return (ask_sum(id*2,l,r)+ask_sum(id*2+1,l,r)) _;
}
signed main(){
	int m,opt,l,r,val;
	cin>>n>>P;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>m;
	build(1,1,n);//
	while(m--){
		cin>>opt;
		if(opt==1){
			cin>>l>>r>>val; update(1,l,r,val,"mul");
		} else if(opt==2){
			cin>>l>>r>>val;
			update(1,l,r,val,"add");
		} else {
			cin>>l>>r;
			cout<<ask_sum(1,l,r)<<endl;
		}
	}
	return 0;
}
2025/1/13 19:39
加载中...