线段树满江红求调
查看原帖
线段树满江红求调
605945
luo_xiaoran楼主2023/10/29 16:19
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[800005],d[800005],b[800005];
void build(ll l,ll r,ll p){
	if(l==r){
		d[p]=a[l];
		return ;
	}
	ll k=l+((r-l)>>1);
	build(l,k,(p<<1)),build(k+1,r,((p<<1)|1));
	d[p]=d[(p<<1)]+d[((p<<1)|1)];
}
void update(ll l,ll r,ll s,ll t,ll k,ll p){
	if(l>r) return ;
	if(l<=s&&t<=r){
		d[p]+=(t-s+1)*k,b[p]+=k;
		return ;
	}
	ll i=s+((t-s)>>1);
	if(b[p]) d[(p<<1)]+=(i-s+1)*b[p],d[((p<<1)|1)]+=(t-i)*b[p],b[(p<<1)]+=b[p],b[((p<<1)|1)]+=b[p];
	b[p]=0;
	if(i>=l) update(l,r,s,i,k,(p<<1));
	if(r>i) update(l,r,i+1,t,k,((p<<1)|1));
	d[p]=d[(p<<1)]+d[((p<<1)|1)];
}
ll sum(ll l,ll r,ll s,ll t,ll p){
	if(l>r) return 0;
	if(l<=s&&t<=r) return d[p];
	ll i=s+((t-s)>>1);
	if(b[p]) d[(p<<1)]+=(i-s+1)*b[p],d[((p<<1)|1)]+=(t-i)*b[p],b[(p<<1)]+=b[p],b[((p<<1)|1)]+=b[p];
	b[p]=0;
	ll he=0;
	if(i>=l) he=sum(l,r,s,i,(p<<1));
	if(r>i) he+=sum(l,r,i+1,t,((p<<1)|1));
	return he;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=0;i<n;i++) scanf("%lld",&a[i]);
	build(1,n-1,1);
	while(m--){
		ll op,x,y,k;
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld %lld %lld",&x,&y,&k),update(x,y-1,1,n-1,k,1);
			if(x==1) a[0]+=k;
		}
		else if(op==2) scanf("%lld",&x),a[0]+=x;
		else if(op==3) scanf("%lld",&x),a[0]-=x;
		else if(op==4) scanf("%lld%lld",&x,&y),printf("%lld\n",sum(x,y-1,1,n-1,1)+(x==1?a[0]:0));
		else printf("%lld\n",a[0]);
	}
	return 0;
}

将主墓单独拉出来判断,样例能过

2023/10/29 16:19
加载中...