线段树10pts求调
查看原帖
线段树10pts求调
762010
Lizj楼主2023/11/25 14:52
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
	int dat,l,r,add,minn;
}e[200010<<2];
int a[200010];
void build(int l,int r,int p){
	e[p].l=l,e[p].r=r;
	if(l==r){
		e[p].minn=e[p].dat=a[l];
		return;
	}
	int mid=l+((r-l)>>1);
	build(l,mid,p*2),build(mid+1,r,p*2+1);
	e[p].dat=e[p*2].dat+e[p*2+1].dat;
	e[p].minn=min(e[p*2].minn,e[p*2+1].minn);
}
int getsum(int l,int r,int p){
	if(l<=e[p].l&&e[p].r<=r)
		return e[p].dat;
	int mid=e[p].l+((e[p].r-e[p].l)>>1),sum=0;
	if(e[p].add){
		e[p*2].add+=e[p].add,e[p*2+1].add+=e[p].add;
		e[p*2].dat+=e[p].add*(e[p*2].r-e[p*2].l+1),e[p*2+1].dat+=e[p].add*(e[p*2+1].r-e[p*2+1].l+1);
		e[p*2].minn+=e[p].add,e[p*2+1].minn+=e[p].add;
		e[p].add=0;
	}
	if(l<=mid)
		sum+=getsum(l,r,p*2);
	if(r>mid)
		sum+=getsum(l,r,p*2+1);
	return sum;
}
void update(int l,int r,int c,int p){
	if(l<=e[p].l&&e[p].r<=r){
		e[p].add+=c,e[p].dat+=(e[p].r-e[p].l+1)*c,e[p].minn+=c;
		return;
	}
	int mid=e[p].l+((e[p].r-e[p].l)>>1);
	if(e[p].add){
		e[p*2].add+=e[p].add,e[p*2+1].add+=e[p].add;
		e[p*2].dat+=e[p].add*(e[p*2].r-e[p*2].l+1),e[p*2+1].dat+=e[p].dat*(e[p*2+1].r-e[p*2+1].l+1);
		e[p*2].minn+=e[p].add,e[p*2	+1].minn+=e[p].add;
		e[p].add=0;
	}
	if(l<=mid)
		update(l,r,c,p*2);
	if(r>mid)
		update(l,r,c,p*2+1);
	e[p].dat=e[p*2].dat+e[p*2+1].dat;
	e[p].minn=min(e[p*2].minn,e[p*2+1].minn);
}
int querymin(int l,int r,int p){
	if(l<=e[p].l&&e[p].r<=r)
		return e[p].minn;
	int mid=e[p].l+((e[p].r-e[p].l)>>1),ans=INT_MAX;
	if(e[p].add){
		e[p*2].add+=e[p].add,e[p*2+1].add+=e[p].add;
		e[p*2].dat+=e[p].add*(e[p*2].r-e[p*2].l+1),e[p*2+1].dat+=e[p].add*(e[p*2+1].r-e[p*2+1].l+1);
		e[p*2].minn+=e[p].add,e[p*2+1].minn+=e[p].add;
		e[p].add=0;
	}
	if(l<=mid)
		ans=min(ans,querymin(l,r,p*2));
	if(r>mid)
		ans=min(ans,querymin(l,r,p*2+1));
	return ans;
}
signed main(){
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	while(q--){
		char op;
		cin>>op;
		if(op=='M'){
			int a,b;
			cin>>a>>b;
			cout<<querymin(a,b,1)<<endl;
		}
		if(op=='P'){
			int a,b,c;
			cin>>a>>b>>c;
			update(a,b,c,1);
		}
		if(op=='S'){
			int a,b;
			cin>>a>>b;
			cout<<getsum(a,b,1)<<endl;
		}
	}
	return 0;
}
2023/11/25 14:52
加载中...