10分,在线求调
  • 板块灌水区
  • 楼主BLty777
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/11 19:24
  • 上次更新2024/12/11 22:23:08
查看原帖
10分,在线求调
1124954
BLty777楼主2024/12/11 19:24

这道题

#include<bits/stdc++.h>
#define int long long
#define ll p<<1
#define rr p<<1|1
using namespace std;
const int N=2e5+5;
int n,q,a[N],x,y,z;
char c;
struct stu{
	int l,r,sum,mi,tag;
}tr[4*N]; 
void pushup(int p){
	tr[p].sum=tr[ll].sum+tr[rr].sum;
	tr[p].mi=min(tr[ll].mi,tr[rr].mi);
	return ;
}
void build(int p,int l,int r){
	tr[p].l=l;
	tr[p].r=r;
	if(l==r){
		tr[p].sum=tr[p].mi=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ll,l,mid);
	build(rr,mid+1,r);
	pushup(p);
}
void pushdown(int p){
	if(tr[p].tag){
		tr[ll].tag+=tr[p].tag;
		tr[rr].tag+=tr[p].tag;
		tr[ll].mi+=tr[p].tag;
		tr[rr].mi+=tr[p].tag;
		tr[ll].sum+=(tr[ll].r-tr[ll].l+1)*tr[p].tag;
		tr[rr].sum+=(tr[rr].r-tr[ll].l+1)*tr[p].tag;
		tr[p].tag=0;
	}
	return ;
}
int querymi(int p,int x,int y){
	if(tr[p].l>=x&&tr[p].r<=y){
		return tr[p].mi;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1,num=LLONG_MAX;
	if(x<=mid) num=querymi(ll,x,y);
	if(y>mid) num=min(num,querymi(rr,x,y));
	return num;
}
int querys(int p,int x,int y){
	if(tr[p].l>=x&&tr[p].r<=y){
		return tr[p].sum;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1,num=0;
	if(x<=mid) num+=querys(ll,x,y);
	if(y>mid) num+=querys(rr,x,y);
	return num;
}
void change(int p,int x,int y,int k){
	if(tr[p].l>=x&&tr[p].r<=y){
		tr[p].sum+=(tr[p].r-tr[p].l+1)*k;
		tr[p].tag+=k;
		tr[p].mi+=k;
		return ; 
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(x<=mid) change(ll,x,y,k);
	if(y>mid) change(rr,x,y,k);
	pushup(p);
}
signed main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		cin>>c;
		if(c=='M'){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",querymi(1,x,y));
		}else if(c=='S'){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",querys(1,x,y));
		}else if(c=='P'){
			scanf("%lld%lld%lld",&x,&y,&z);
			change(1,x,y,z);
		}
	}
	return 0;
}
2024/12/11 19:24
加载中...