线段树求助
  • 板块灌水区
  • 楼主IridoYume
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/10/9 08:26
  • 上次更新2023/11/2 14:50:44
查看原帖
线段树求助
752992
IridoYume楼主2023/10/9 08:26

板子70pts

#include<bits/stdc++.h>
#define ll long long
#define MAXN 100001
using namespace std;
int n,m;
int a[MAXN],ans[MAXN<<2],lazy[MAXN<<2];
inline ll ls(ll x){
	return x<<1;
}
inline ll rs(ll x){
	return x<<1|1;
}
inline void push_up(ll p){
	ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r){
	if(l==r){
		ans[p]=a[l];
		return ;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
inline void f(ll p,ll l,ll r,ll k){
	lazy[p]=lazy[p]+k;
	ans[p]=ans[p]+(k*(r-l+1));
}
inline void push_down(ll p,ll l,ll r){
	ll mid=(l+r)>>1;
	f(ls(p),l,mid,lazy[p]);
	f(rs(p),mid+1,r,lazy[p]);
	lazy[p]=0;
}
inline void updata(ll nl,ll nr,ll l,ll r,ll p,ll k){
	if(nl<=l&&nr>=r){
		ans[p]=ans[p]+(k*(r-l+1));
		lazy[p]=lazy[p]+k;
		return ;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(nl<=mid){
		updata(nl,nr,l,mid,ls(p),k);
	}
	if(nr>mid){
		updata(nl,nr,mid+1,r,rs(p),k);
	}
	push_up(p);
}
ll query(ll qx,ll qy,ll l,ll r,ll p){
	ll res=0;
	if(qx<=l&&r<=qy){
		return ans[p];
	}
	ll mid=(l+r)>>1;
	push_down(p,l,r);
	if(qx<=mid){
		res+=query(qx,qy,l,mid,ls(p));
	}
	if(qy>mid){
		res+=query(qx,qy,mid+1,r,rs(p));
	}
	return res;
}
int main(){
	ll a1,b,c,d,e,f;
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	while(m--){
		scanf("%lld",&a1);
		if(a1==1){
			scanf("%lld%lld%lld",&b,&c,&d);
			updata(b,c,1,n,1,d);
		}
		if(a1==2){
			scanf("%lld%lld",&e,&f);
			printf("%lld\n",query(e,f,1,n,1));
		}
	}
	return 0;
} 
2023/10/9 08:26
加载中...