为何样例过不去
查看原帖
为何样例过不去
537627
_LSA_楼主2022/10/13 22:26

样例第一个输出不对

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

ll read(){
	char ch = getchar();
	while(!isdigit(ch) && ch != '-') ch = getchar();
	ll X = 0 , f = 1;
	if(ch == '-') f = -1 , ch = getchar();
	while(isdigit(ch)) X = (X<<1)+(X<<3)+ch-'0' , ch = getchar();
	return X*f;
}


const int N = 5e4+11;
struct SegmentTree{
	int l,r;
	int sum,dat,lmax,rmax;
	#define ls(x) x<<1
	#define rs(x) x<<1|1
}t[N<<2];
int n;

inline void push_up(int x){
	t[x].sum = t[ls(x)].sum+t[rs(x)].sum;
	t[x].lmax = max(t[ls(x)].lmax,t[ls(x)].sum+t[rs(x)].lmax);
	t[x].rmax = max(t[rs(x)].rmax,t[rs(x)].sum+t[ls(x)].rmax);
	t[x].dat = max(t[ls(x)].dat,max(t[rs(x)].dat,t[ls(x)].rmax+t[rs(x)].lmax));
}

void build(int p,int l,int r){
	t[p].l = l; t[p].r = r;
	if(l == r){
		int c = read();
		t[p].lmax=t[p].rmax=t[p].dat=t[p].sum=c;
		return;
	}
	int mid = (l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}

void update(int p,int x,int c){
	if(t[p].l == t[p].r){
		t[p].lmax=t[p].rmax=t[p].dat=t[p].sum = c;
		return;
	}
	int mid = (t[p].l+t[p].r)>>1;
	if(x<=mid) update(ls(p),x,c);
	else update(rs(p),x,c);
	push_up(p);
}

int query(int p,int l,int r){
	if(l <= t[p].l && r >= t[p].r) return t[p].dat;
	int mid = (t[p].l+t[p].r)>>1 , val = -1e9;
	if(l <= mid) val = max(val,query(ls(p),l,r));
	if(r >  mid) val = max(val,query(rs(p),l,r));
	return val;
}

int main(){
	n = read();
	build(1,1,n);
	int q = read();
	while(q--){
		int op = read(),
		x = read(),
		y = read();
		if(op == 0){
			update(1,x,y);
		}else{
			cout << query(1,x,y) << '\n';
		}
	}
	return 0;
}
2022/10/13 22:26
加载中...