UKE求调
查看原帖
UKE求调
1349524
1234567890C楼主2025/8/2 14:27

SP1043
大不列颠的错误(UKE)求调

#include<bits/stdc++.h>
using namespace std;
struct node{
    int sum,ql,qr,s;
}tree[2000005];
int n,a[500005];
void pushup(node &x,node &l,node &r) {
    x.sum=l.sum+r.sum;
    x.ql=max(l.ql,l.sum+r.ql);
    x.qr=max(r.qr,r.sum+l.qr);
    x.s=max({l.s,r.s,l.qr+r.ql});
}
void build(int x,int l,int r){
    if(l==r){
        tree[x]={a[l],a[l],a[l],a[l]};
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(tree[x],tree[x<<1],tree[x<<1|1]);
}
node query(int x,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr){
		return tree[x];
	}
    int mid=(l+r)>>1;
    if(qr<=mid){
		return query(x<<1,l,mid,ql,qr);
	}
    if(ql>mid){
		return query(x<<1|1, mid+1, r, ql, qr);
	}
    node le=query(x<<1,l,mid,ql,qr);
    node ri=query(x<<1|1,mid+1,r,ql,qr);
    node res;
    pushup(res,le,ri);
    return res;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
		cin>>a[i];
	}
    build(1,1,n);
    int m;
	cin>>m;
    while(m--){
        int l,r;
        cin>>l>>r;
        cout<<query(1,1,n,l,r).s<<"\n";
    }
    return 0;
}
2025/8/2 14:27
加载中...