线段树模板,RE,马蜂太差,大佬见谅
查看原帖
线段树模板,RE,马蜂太差,大佬见谅
180453
wangyansong楼主2020/11/30 21:48
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int M=2000005;
ll n,m,a[M*4],t[M*4],lazy[M*4];
inline void f(ll x,ll l,ll r,ll k)
{
	lazy[x]+=k;
	t[x]=t[x]+k*(r-l+1);
}
inline void down(ll l,ll r,ll x)
{
	ll mid=(l+r)>>1;
	f(x<<1,l,mid,lazy[x]);
	f(x<<1|1,mid+1,r,lazy[x]);
	lazy[x]=0;
}
inline void push_up(ll x)
{
	t[x]=t[x<<1]+t[x<<1|1];
	return ;
}
void build (ll l,ll r,ll x)
{
	if(l==r) {
		t[x]=a[l];return ;
	}
	ll mid=(l+r)>>1;
	build(1,mid,x<<1);
	build(mid+1,r,x<<1|1);
	push_up(x);
}
inline void update(ll x,ll y,ll l,ll r,ll p,ll k)
{
	if(x<=l&&r<=y){
		t[p]+=(r-l+1)*k;
		lazy[p]+=k;return ;
	}
	down(l,r,p);
	ll mid=(l+r)>>1;
	if(x<=mid) update(x,y,l,mid,p<<1,k);
	if(y>mid) update(x,y,mid+1,r,p<<1|1,k);
	push_up(p);
}
inline ll query(ll x,ll y,ll l,ll r,ll p)
{
	ll res=0;
	if(x<=l&&r<=y) return t[p];
	down(l,r,x);
	ll mid=(l+r)>>1;
	if(x<=mid) res+=query(x,y,l,mid,p<<1);
	if(y>mid) res+=query(x,y,mid+1,r,p<<1|1);
	return res;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
	build(1,n,1);
	while(m--){
		ll p,x,y,k;
		cin>>p;
		if(p==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			update(x,y,1,n,1,k);
		}
		if(p==2){
			scanf("%lld",&k);
			update(1,1,1,n,1,k);
		}
		if(p==3){
			scanf("%lld",&k);
			update(1,1,1,n,1,-k);
		}
		if(p==4){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(x,y,1,n,1));
		}
		if(p==5){
			printf("%lld\n",query(1,1,1,n,1));
		}
	}
}
2020/11/30 21:48
加载中...