求助,线段树板子RE
查看原帖
求助,线段树板子RE
242012
Perfumer楼主2020/10/3 23:12

rt

#include <cstdio>
#define int long long
#define MAXN 100005
using namespace std;
int n,m;
int a[MAXN];
int tag[MAXN<<2];
int t[MAXN<<2];
inline int ls(int p) {return p<<1;}
inline int rs(int p) {return p<<1|1;}
inline int push_up(int p) {t[p]=t[ls(p)]+t[rs(p)];}
inline void build(int l,int r,int p) {
	tag[p]=0;
	if(l==r) {t[p]=a[l]; return ;}
	int mid=(l+r)>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	push_up(p);
}
inline void f(int l,int r,int p,int k) {
	tag[p]=tag[p]+k;
	t[p]=t[p]+(r-l+1)*k;
}
inline void push_down(int l,int r,int p) {
	int mid=(l+r)>>1;
	f(l,mid,ls(p),tag[p]);
	f(mid+1,r,rs(p),tag[p]);
	tag[p]=0;
}
inline void update(int l,int r,int p,int k,int ql,int qr) {
	if(ql<=l&&qr>=r) {
		tag[p]+=k;
		t[p]+=k*(r-l+1);
		return ;
	}
	push_down(l,r,p);
	int mid=(l+r)>>1;
	if(ql<=mid) update(l,mid,ls(p),k,ql,qr);
	if(qr>mid) update(mid+1,r,rs(p),k,ql,qr);
	push_up(p);
}
inline int query(int l,int r,int p,int ql,int qr) {
	int res=0;
	if(ql<=l&&qr>=r) return t[p];
	int mid=(l+r)>>1;
	push_down(l,r,p);
	if(ql<=mid) res+=query(l,mid,ls(p),ql,qr);
	if(qr>mid) res+=query(mid+1,r,rs(p),ql,qr);
	return res;
}
signed main() {
	scanf("%lld%lld",&n,&m);
	for(register int i=1;i<=n;++i) scanf("%lld",a+i);
	build(1,n,1);
	while(m--) {
		int opt,x,y,k;
		scanf("%lld",opt);
		if(opt==1) {
			scanf("%lld%lld%lld",&x,&y,&k);
			update(1,n,1,k,x,y); 
		} else {
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,n,1,x,y));
		}
	}
	return 0;
}

似乎是爆栈了,请问哪里有问题?

2020/10/3 23:12
加载中...