萌新求助(又是一道模板题QwQ)
查看原帖
萌新求助(又是一道模板题QwQ)
167521
垣根帝督楼主2021/9/14 20:37

RT

#include <bits/stdc++.h>
using namespace std;
#define ls(id) (id<<1)
#define rs(id) (id<<1|1)
const int maxn=200005;
int n,m;
int opt,l,r,k;
char ch;
int a[maxn];
int Min[maxn<<2],sum[maxn<<2];
void update(int id,int l,int r,int L,int R,int k){
	if(L<=l&&r<=R){
		sum[id]+=k;
		Min[id]+=k;
		return;
	}
	int mid=l+r>>1;
	if(L<=mid)update(ls(id),l,mid,L,R,k);
	if(R> mid)update(rs(id),mid+1,r,L,R,k);
	sum[id]=sum[ls(id)]+sum[rs(id)];
	Min[id]=min(Min[ls(id)],Min[rs(id)]);
}
void push_down(int id){
	sum[ls(id)]+=sum[id];
	sum[rs(id)]+=sum[id];
	Min[ls(id)]+=Min[id];
	Min[rs(id)]+=Min[id];
	sum[id]=Min[id]=0;
}
int query_sum(int id,int l,int r,int L,int R){
	if(L<=l&&r<=R)return a[l]+sum[id];
	int mid=l+r>>1;
	int ans=0;
	if(L<=mid)ans+=query_sum(ls(id),l,mid,L,R);
	if(R> mid)ans+=query_sum(rs(id),mid+1,r,L,R);
	return ans;
}
int query_min(int id,int l,int r,int L,int R){
	if(L<=l&&r<=R)return a[l]+Min[id];
	int mid=l+r>>1;
	int ans=0x3f3f3f3f;
	if(L<=mid)ans=min(ans,query_min(ls(id),l,mid,L,R));
	if(R> mid)ans=min(ans,query_min(rs(id),mid+1,r,L,R));
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>ch>>l>>r;
		if(ch=='M'){//min
			cout<<query_min(1,1,n,l,r)<<"\n";
		}
		else if(ch=='S'){//sum
			cout<<query_sum(1,1,n,l,r)<<"\n";
		}
		else {
			cin>>k;
			update(1,1,n,l,r,k);
		}
	}
	return 0;
}
2021/9/14 20:37
加载中...