18pts 求助
查看原帖
18pts 求助
398310
hundunqidian楼主2022/10/3 09:47

过了前两个点,其余点RE

using namespace std;
int const X=1e6+10;
int n,m,a[X],k,aa,bb;
struct tree{
	int LS,RS,sum,S;
};
tree t[X<<2];
inline int ls(int x){
	return x<<2;
}
inline int rs(int x){
	return x<<2 | 1;
}
void pushup(tree &rt,tree &tL,tree &tR){
	rt.S=max(tL.RS+tR.LS,max(tL.S,tR.S));
	rt.LS=max(tL.LS,tL.sum+tR.LS);
	rt.RS=max(tR.RS,tL.RS+tR.sum);
	rt.sum=tL.sum+tR.sum;
	return ;
}
void build(int rt,int L,int R){
	if(L==R){
		t[rt].S=a[L];
		t[rt].LS=a[L];
		t[rt].RS=a[L];
		t[rt].sum=a[L];
		return ;
	}
	int mid=(L+R)>>1;
	build(ls(rt),L,mid);
	build(rs(rt),mid+1,R);
	pushup(t[rt],t[ls(rt)],t[rs(rt)]);
	return ;
}
tree query(int rt,int L,int R,int qL,int qR){
	if(qL<=L && R<=qR){
		return t[rt];
	}
	int mid=(L+R)>>1;
	if(qL<=mid && mid+1<=qR){
		tree res,A,B;
		A=query(ls(rt),L,mid,qL,qR);
		B=query(rs(rt),mid+1,R,qL,qR);
		pushup(res,A,B);
		return res;
	}
	else if(qL<=mid){
		return query(ls(rt),L,mid,qL,qR);
	}
	else{
		return query(rs(rt),mid+1,R,qL,qR);
	}
}
void change(int rt,int L,int R,int p,int s){
	if(L==R){
		t[rt].sum=s;
		t[rt].LS=s;
		t[rt].RS=s;
		t[rt].S=s;
		return ;
	}
	int mid=(L+R)>>1;
	if(mid>=p){
		change(ls(rt),L,mid,p,s);
	}
	else{
		change(rs(rt),mid+1,R,p,s);
	}
	pushup(t[rt],t[ls(rt)],t[rs(rt)]);
	return ;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		cin>>k>>aa>>bb;
		if(k==1){
			if(aa>bb) swap(aa,bb);
			cout<<query(1,1,n,aa,bb).S<<endl;
		}
		else{
			change(1,1,n,aa,bb);
		}
	}
	return 0;
} ```
2022/10/3 09:47
加载中...