c++11过了,c++98CE,求差错
  • 板块学术版
  • 楼主Komodo
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/12/2 16:04
  • 上次更新2023/11/5 06:53:22
查看原帖
c++11过了,c++98CE,求差错
92840
Komodo楼主2020/12/2 16:04

RT.

题目是过了,但似乎用了什么c++98不支持的东西。。

求大佬帮忙查错qwq

#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define lc (rt<<1)
#define rc ((rt<<1)|1)
int n,q;
int sg[N<<2],mx[N<<2],lmx[N<<2],rmx[N<<2];
int a[N];
void pushup(int rt){
	sg[rt]=sg[lc]+sg[rc];
	lmx[rt]=max(lmx[lc],sg[lc]+lmx[rc]);
	rmx[rt]=max(rmx[rc],sg[rc]+rmx[lc]);
	mx[rt]=max(max(mx[lc],mx[rc]),lmx[rc]+rmx[lc]);
}
void build(int rt,int l,int r){
	if(l==r){
		sg[rt]=mx[rt]=lmx[rt]=rmx[rt]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(rt);
}
void update(int rt,int l,int r,int x,int y){
	if(l==r){
		sg[rt]=mx[rt]=lmx[rt]=rmx[rt]=y;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)update(lc,l,mid,x,y);
	else update(rc,mid+1,r,x,y);
	pushup(rt);
}
struct data{
	int mx,lmx,rmx,sg;
};
data query(int rt,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr)return (data){mx[rt],lmx[rt],rmx[rt],sg[rt]};
	int mid=(l+r)>>1;
	if(ql<=mid&&mid<qr){
		data ret=(data){0,0,0,0};
		data ll=query(lc,l,mid,ql,qr),rr=query(rc,mid+1,r,ql,qr);
		ret={max(max(ll.mx,rr.mx),ll.rmx+rr.lmx),max(ll.lmx,ll.sg+rr.lmx),max(rr.rmx,rr.sg+ll.rmx),ll.sg+rr.sg};
		return ret;
	}else if(ql<=mid){
		return query(lc,l,mid,ql,qr);
	}else{
		return query(rc,mid+1,r,ql,qr);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	scanf("%d",&q);
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int code,a,b;
		scanf("%d%d%d",&code,&a,&b);
		if(code==0){
			update(1,1,n,a,b);
		}else{
			printf("%d\n",query(1,1,n,a,b).mx);
		}
	}
	return 0;
}

2020/12/2 16:04
加载中...