萌新求助。。。
查看原帖
萌新求助。。。
182204
xzy__xzy楼主2022/12/8 21:21

最后三个点runtime error

rs()为区间和修改,xx,yy为t[id]子节点的有效部分。希望各位大佬的指点,谢谢!

#include<bits/stdc++.h>
#define int long long 
#define l(x) 2*x
#define r(x) 2*x+1
using namespace std;
int n,m,a[100012],gg[100004];
int op,xi,yi,ki;
struct g{
	int x,y,p;
}t[470100];
void build(int id,int xx,int yy){
	if(xx==yy) {gg[xx]=id,t[id].x=t[id].y=xx,t[id].p=a[xx];return;
	}
	else if(xx>yy) return;
	else{
		int mid =int((xx+yy)/2);
		build(l(id),xx,mid);
		build(r(id),mid+1,yy);
		t[id].x=xx,t[id].y=yy,t[id].p=t[l(id)].p+t[r(id)].p;
	}
}
void rs(int id,int xx,int yy,int kk){
	if(xx>yy)return;
	else{
		t[id].p+=(yy-xx+1)*kk;
		rs(l(id),max(xx,t[l(id)].x),min(yy,t[l(id)].y),kk);
		rs(r(id),max(xx,t[r(id)].x),min(yy,t[r(id)].y),kk);
	}
}
int q(int x,int y,int id){
	if(x==y)
		return  t[gg[x]].p;
	else if(x>y)
		return 0;
	else
		return q(max(x,t[l(id)].x),min(y,t[l(id)].y),l(id))+q(max(x,t[r(id)].x),min(y,t[r(id)].y),r(id));
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%lld%lld%lld",&xi,&yi,&ki);
			rs(1,xi,yi,ki);
		}
		else{
			scanf("%lld%lld",&xi,&yi);
			printf("%lld\n",q(xi,yi,1));
		}
	}
	return 0;
}

2022/12/8 21:21
加载中...