10pts AC#1线段树
查看原帖
10pts AC#1线段树
1340395
tc291311楼主2025/7/25 15:42
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2000005;
int a[N],lazy[N<<2],t[N<<2],tim[N<<2];
void pushup(int k){
	t[k]=t[k<<1]+t[k<<1|1];
	tim[k]=min(tim[k<<1],tim[k<<1|1]);
}
void build(int k,int l,int r){
	if(l==r){
		t[k]=tim[k]=a[l];
		return ;
	}
	int mid=l+(r-l)/2;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k);
}

void val(int k,int l,int r,int v){
	lazy[k]+=v;
	t[k]+=v*(r-l+1);
    tim[k]+=v*(r-l+1);
}
void pushdown(int k,int l,int r){
	int mid=l+(r-l)/2;
	val(k<<1,l,mid,lazy[k]);
	val(k<<1|1,mid+1,r,lazy[k]);
	lazy[k]=0;
}
void updata(int L,int R,int v,int l,int r,int k){
	if(L<=l&&r<=R){
		t[k]+=v*(r-l+1);
        tim[k]+=v*(r-l+1);
		lazy[k]+=v;
		return ;
	}
	int mid=l+(r-l)/2;
	pushdown(k,l,r);
	if(L<=mid){
		updata(L,R,v,l,mid,k<<1);
	}
	if(R>mid){
		updata(L,R,v,mid+1,r,k<<1|1);
	}
	pushup(k);
}
int query(int L,int R,int l,int r,int k){
	if(L<=l&&r<=R){
		return t[k];
	}
	pushdown(k,l,r);
	int mid=l+(r-l)/2;
	int sum=0;
	if(L<=mid){
		sum+=query(L,R,l,mid,k<<1);
	}
	if(R>mid){
		sum+=query(L,R,mid+1,r,k<<1|1);
	}
	return sum;
}
int query1(int L,int R,int l,int r,int k){
	if(L<=l&&r<=R){
		return tim[k];
	}
	pushdown(k,l,r);
	int mid=l+(r-l)/2;
	int minn=1e9;
	if(L<=mid){
		minn=min(minn,query1(L,R,l,mid,k<<1));
	}
	if(R>mid){
		minn=min(minn,query1(L,R,mid+1,r,k<<1|1));
	}
	return minn;
}
signed main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)	cin>>a[i];
	build(1,1,n);
	while(m--){
		char op;
		cin>>op;
		if(op=='M'){
			int x,y;
			cin>>x>>y;
			cout<<query1(x,y,1,n,1)<<endl;
		}
		else if(op=='S'){
			int x,y;
			cin>>x>>y;
			cout<<query(x,y,1,n,1)<<endl;
		}
		else{
			int x,y,k;
			cin>>x>>y>>k;
			updata(x,y,k,1,n,1);
		}
	}
	return 0;
}
2025/7/25 15:42
加载中...