线段树蜜汁RE求助
查看原帖
线段树蜜汁RE求助
305854
Drind楼主2023/7/13 11:26

RT,只过了第一个点,其他的全部RE了

#include<bits/stdc++.h>
using namespace std;

struct segmenttree{
	long long sum,mx,mxl,mxr;
	int l,r;
}tree[5000001];
int a[5000001];

void pushup(int x){
	tree[x].mx=max(tree[x*2].mxr+tree[x*2+1].mxl,max(tree[x*2].mx,tree[x*2+1].mx));
	tree[x].mxl=max(tree[x*2].mxl,tree[x*2].sum+tree[x*2+1].mxl);
	tree[x].mxr=max(tree[x*2+1].mxr,tree[x*2+1].sum+tree[x*2].mxr);
	tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}

void build(int x,int l,int r){
	tree[x].l=l;
	tree[x].r=r;
	if(l==r){
		tree[x].sum=tree[x].mxl=tree[x].mxr=tree[x].mx=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	pushup(x);
}

void modify(int x,int pos,int v){
	if(tree[x].l==tree[x].r&&tree[x].l==pos){
		tree[x].sum=tree[x].mxl=tree[x].mxr=tree[x].mx=v;
		return;
	}
	int mid=(tree[x].l+tree[x].r)/2;
	if(mid>=pos) modify(x*2,pos,v);
	if(pos>mid) modify(x*2+1,pos,v);
	pushup(x);
}

segmenttree query(int x,int l,int r){
	if(tree[x].l>=l&&tree[x].r<=r){
		return tree[x];
	}
	int mid=(tree[x].l+tree[x].r)/2;
	segmenttree ans;
	if(mid>=r) return query(x*2,l,r);
	else if(l>mid) return query(x*2+1,l,r);
	else{
		segmenttree a=query(x*2,l,r),b=query(x*2+1,l,r);
		ans.mxl=max(a.mxl,a.sum+b.mxl);
		ans.mxr=max(b.mxr,b.sum+a.mxr);
		ans.mx=max(max(a.mx,b.mx),a.mxr+b.mxl);
	}
	return ans;
}

int main(){
	long long n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int opt;
		cin>>opt;
		if(opt==1){
			int l,r;
			cin>>l>>r;
			cout<<query(1,l,r).mx<<endl;
		}
		if(opt==2){
			int pos,val;
			cin>>pos>>val;
			modify(1,pos,val);
		}
	}
}
2023/7/13 11:26
加载中...