蒟蒻求助 线段树 30pts
查看原帖
蒟蒻求助 线段树 30pts
400468
Aakkosetsumussa楼主2023/7/1 16:04
#include<bits/stdc++.h>
using namespace std;
typedef long long inr;
const inr maxn=2000190;
inr n,m,a[maxn],sum[maxn<<2],tag[maxn<<2],mn[maxn];
#define ls(y) y<<1
#define rs(y) (y<<1)+1
inline void up(inr y) {
	//push the tag up
	sum[y]=sum[ls(y)]+sum[rs(y)];
	mn[y]=min(mn[ls(y)],mn[rs(y)]);
}
inline void build(inr p,inr l,inr r) {
	//now, left, right
	tag[p]=0;
	if(l==r) {
		sum[p]=mn[p]=a[l];
		return;
	}
	inr m=(l+r)/2;
	build(ls(p),l,m);
	build(rs(p),m+1,r);
	up(p);
}
inline void chan(inr p,inr l,inr r,inr k) {
	//now, now left, now right, plus sum
	tag[p]+=k;
	sum[p]=sum[p]+k*(r-l+1);
	mn[p]+=k;
}
inline void down(inr p,inr l,inr r) {
	//now, now left, now right
	//push the tag down
	inr m=(l+r)>>1;
	chan(ls(p),l,m,tag[p]);
	chan(rs(p),m+1,r,tag[p]);
	tag[p]=0;
}
inline void update(inr sl,inr sr,inr l,inr r,inr p,inr k) {
	//left, right, now left, now right, now, plus
	if(sl<=l&&r<=sr) {//if included
		sum[p]+=k*(r-l+1);
		tag[p]+=k;
		mn[p]+=k;
		return;
	}
	//if not included
	down(p,l,r);
	inr m=(l+r)>>1;
	if(sl<=m) update(sl,sr,l,m,ls(p),k);
	if(sr>m) update(sl,sr,m+1,r,rs(p),k);
	up(p);
}
inline inr quesum(inr qx,inr qy,inr l,inr r,inr p) {
	//left, right, now left, now right, now
	inr res=0;
	if(qx<=l&&r<=qy) return sum[p];
	inr m=(l+r)>>1;
	down(p,l,r);
	if(qx<=m) res+=quesum(qx,qy,l,m,ls(p));
	if(qy>m) res+=quesum(qx,qy,m+1,r,rs(p));
	return res;
}
inline inr quemin(inr qx,inr qy,inr l,inr r,inr p) {
	//left, right, now left, now right, now
	inr res1=1e7,res2=1e7;
	if(qx<=l&&r<=qy) return mn[p];
	inr m=(l+r)>>1;
	down(p,l,r);
	if(qx<=m) res1=quemin(qx,qy,l,m,ls(p));
	if(qy>m) res2=quemin(qx,qy,m+1,r,rs(p));
	return min(res1,res2);
}
inr x,y,k;
char sc;
int main() {
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(inr i=1; i<=n; i++) cin>>a[i];
	build(1,1,n);
	while(m--) {
		cin>>sc;
		if(sc=='M') {
			cin>>x>>y;
			cout<<quemin(x,y,1,n,1)<<endl;//find
		} else if(sc=='P'){
			cin>>x>>y>>k;
			update(x,y,1,n,1,k);
		}else{
			cin>>x>>y;
			cout<<quesum(x,y,1,n,1)<<endl;
		}
	}
	return 0;
}
2023/7/1 16:04
加载中...