线段树10ptsAC on#1 求调
查看原帖
线段树10ptsAC on#1 求调
889498
Bei_Gua_楼主2024/9/9 22:10

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,inf=1e18;
int n,q;
int a[N],tmin[N<<2],tsum[N<<2],lz[N<<2];
int ls(int o){return o<<1;}
int rs(int o){return o<<1|1;}
void f(int s,int e,int o,int x){
	tmin[o]+=x*(e-s+1);
	tsum[o]+=x*(e-s+1);
	lz[o]+=x;
}
void push_up(int o){
	tmin[o]=min(tmin[ls(o)],tmin[rs(o)]);
	tsum[o]=tsum[ls(o)]+tsum[rs(o)];
}
void build(int s=1,int e=n,int o=1){
	if (s==e){
		tmin[o]=a[s];
		tsum[o]=a[s];
		return;
	}
	int mid=(s+e)>>1;
	build(s,mid,ls(o));
	build(mid+1,e,rs(o));
	push_up(o);
}
void push_down(int s,int e,int o){
	if (!lz[o])return;
	int mid=(s+e)>>1;
	f(s,mid,ls(o),lz[o]);
	f(mid+1,e,rs(o),lz[o]);
	lz[o]=0;
}
void update(int l,int r,int x,int s=1,int e=n,int o=1){
	if (l<=s&&e<=r){
		f(s,e,o,x);
		return;
	}
	push_down(s,e,o);
	int mid=(s+e)>>1;
	if (mid>=l)update(l,r,x,s,mid,ls(o));
	if (mid+1<=r)update(l,r,x,mid+1,e,rs(o));
	push_up(o);
}
int query_min(int l,int r,int s=1,int e=n,int o=1){
	if (l<=s&&e<=r){
		return tmin[o];
	}
	push_down(s,e,o);
	int mid=(s+e)>>1,res=inf;
	if (mid>=l)res=min(res,query_min(l,r,s,mid,ls(o)));
	if (mid+1<=r)res=min(res,query_min(l,r,mid+1,e,rs(o)));
	return res;
}
int query_sum(int l,int r,int s=1,int e=n,int o=1){
	if (l<=s&&e<=r){
		return tsum[o];
	}
	push_down(s,e,o);
	int mid=(s+e)>>1,res=0;
	if (mid>=l)res+=query_sum(l,r,s,mid,ls(o));
	if (mid+1<=r)res+=query_sum(l,r,mid+1,e,rs(o));
	return res;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for (int i=1;i<=n;i++)cin>>a[i];
	build();
	for (int i=1;i<=q;i++){
		char op;
		cin>>op;
		if (op=='M'){
			int l,r;
			cin>>l>>r;
			cout<<query_min(l,r)<<"\n";
		}else if (op=='P'){
			int l,r,x;
			cin>>l>>r>>x;
			update(l,r,x);
		}else if (op=='S'){
			int l,r;
			cin>>l>>r;
			cout<<query_sum(l,r)<<"\n";
		}
	}
}
2024/9/9 22:10
加载中...