10 pts 求助,
查看原帖
10 pts 求助,
868864
zjinze楼主2024/2/29 13:21
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=300010; 
struct node{
	int sum;
	int min;
}tree[4*N];
int l,r,value,n,q,a[N],tag[4*N];
char op;
void maketag(int u,int l,int r,int value){
	tag[u]+=value;
	tree[u].sum+=value*(r-l+1);
	tree[u].min+=value;
	return ;
}
void pushdown(int u,int l,int r){
	if(tag[u]){
		int mid=(l+r)>>1;
		maketag(2*u,l,mid,tag[u]);
		maketag(2*u+1,mid+1,r,tag[u]);
		tag[u]=0;
	}
	return ;
}
void pushup(int u){
	tree[u].sum=tree[2*u].sum+tree[2*u+1].sum;
	tree[u].min=min(tree[2*u].min,tree[2*u+1].sum);
	return ;
}
void build(int u,int l,int r){
	if(l==r){
		tree[u].sum=a[l];
		tree[u].min=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(2*u,l,mid);
	build(2*u+1,mid+1,r);
	pushup(u);
	return ;
}
void update(int u,int l,int r,int targetl,int targetr,int value){
	if(targetl<=l && r<=targetr){
		maketag(u,l,r,value);
		return ;
	}
	pushdown(u,l,r);
	int mid=(l+r)>>1;
	if(targetl<=mid){
		update(2*u,l,mid,targetl,targetr,value);
	}
	if(targetr>mid){
		update(2*u+1,mid+1,r,targetl,targetr,value);
	}
	pushup(u);
	return ;
}
int querysum(int u,int l,int r,int targetl,int targetr){
	if(targetl<=l && r<=targetr){
		return tree[u].sum;
	}
	pushdown(u,l,r);
	int ans=0;
	int mid=(l+r)>>1;
	if(targetl<=mid){
		ans+=querysum(2*u,l,mid,targetl,targetr);
	}
	if(targetr>mid){
		ans+=querysum(2*u+1,mid+1,r,targetl,targetr);
	}
	return ans;
}
int querymin(int u,int l,int r,int targetl,int targetr){
	if(targetl<=l && r<=targetr){
		return tree[u].min;
	}
	pushdown(u,l,r);
	int ans=1e18;
	int mid=(l+r)>>1;
	if(targetl<=mid){
		ans=min(ans,querymin(2*u,l,mid,targetl,targetr));
	}
	if(targetr>mid){
		ans=min(ans,querymin(2*u+1,mid+1,r,targetl,targetr));
	}
	return ans;
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(q--){
		cin>>op;
		if(op=='P'){
			cin>>l>>r>>value;
			update(1,1,n,l,r,value);
		}
		else if(op=='M'){
			cin>>l>>r;
			cout<<querymin(1,1,n,l,r)<<"\n";
		}
		else{
			cin>>l>>r;
			cout<<querysum(1,1,n,l,r)<<"\n";
		}
	}
	return 0;
}
2024/2/29 13:21
加载中...