想问下这份代码为什么编译失败(本地)
查看原帖
想问下这份代码为什么编译失败(本地)
421265
eastcloud楼主2022/7/4 09:12

rt,每次编译失败时都会跳到其他界面,没有指出代码里的错误,感觉像是变量重复了,但是我也找不到,求大佬帮忙看看。

#include<iostream>
using namespace std;
struct Node{
	int dat,lmax,rmax,sum,l,r;
	#define s(x) tr[x].sum
	#define lm(x) tr[x].lmax
	#define rm(x) tr[x].rmax
	#define v(x) tr[x].dat
	#define l(x) tr[x].l
	#define r(x) tr[x].r
}tr[200001];
int val[200001];
void build(int x,int l,int r){
	l(x)=l;
	r(x)=r;
	if(l==r){
		s(x)=val[l];
		lm(x)=s(x);
		rm(x)=s(x);
		v(x)=s(x);
		return;
	}
	int mid=(r+l)>>1;
	build(2*x,l,mid);
	build(2*x+1,mid+1,r);
	s(x)=s(2*x)+s(2*x+1);
	lm(x)=max(lm(2*x),s(2*x)+lm(2*x+1));
	rm(x)=max(rm(2*x+1),s(2*x+1)+rm(2*x));
	v(x)=max(max(v(2*x),v(2*x+1)),lm(2*x+1),rm(2*x));
}
void change(int x,int num,int v){
	if(l(x)==r(x)){
		s(x)=v;
		lm(x)=v;
		rm(x)=v;
		v(x)=v;
		return;
	}
	int mid=(l(x)+r(x))>>1;
	if(num<=mid) change(2*x,num,v);
	else change(2*x+1,num,v);
	s(x)=s(2*x)+s(2*x+1);
	lm(x)=max(lm(2*x),s(2*x)+lm(2*x+1));
	rm(x)=max(rm(2*x+1),s(2*x+1)+rm(2*x));
	v(x)=max(max(v(2*x),v(2*x+1)),lm(2*x+1),rm(2*x));
}
Node query(int x,int l,int r){
	if(l(x)>=l && r(x)<=r)return tr[x];
	int mid=(l(x)+r(x))>>1;
	if(r<=mid) return query(2*x,l,r);
	else if(l>mid) return query(2*x+1,l,r);
	Node L=query(2*x,l,r),R=query(2*x+1,l,r);
	Node tmp;
	tmp.l=0;
	tmp.r=0;
	tmp.sum=L.sum+R.sum;
	tmp.lmax=max(L.lmax,L.sum+R.lmax);
	tmp.rmax=max(R.rmax,R.sum+L.rmax);
	tmp.dat=max(max(L.dat,R.dat),R.lmax+L.rmax);
	return tmp;
}
int main(){
	int n,q,opt,x,y;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>val[i];
	build(1,1,n);
	cin>>q;
	for(int i=1;i<=n;i++){
		cin>>opt>>x>>y;
		if(!opt)change(1,x,y);
		else cout<<(query(1,x,y).dat);
	}
}
2022/7/4 09:12
加载中...