#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=250010, S=(1<<18);
int n, q, a[N], f[N];
class seg {
public:
    void init() {update(1, n);}
    void update(int l, int r) {update(1, 1, n, l, r);}
    int query(int l, int r) {
        Node tmp=query(1, 1, n, l, r);
        int ret=0;
        for (int i=0; i<tmp.s; i++) {
            ret=max(ret, tmp.g[i][1]-1);
        }
        return 2*ret+1;
    }
private:
    struct Node {
        int p, s;
        array<int, 2> g[51];
        Node operator+(const Node& r) {
            Node ret;
            ret.p=p, ret.s=0;
            for (int i=0; i<s; i++) {
                if (g[i][0]>=r.p+r.s) ret.g[ret.s++]=g[i];
                else ret.g[ret.s++]={r.g[g[i][0]-r.p][0], r.g[g[i][0]-r.p][1]+g[i][1]};
            }
            for (int i=0; i<r.s; i++) {
                if (ret.s>50) break;
                ret.g[ret.s++]=r.g[i];
            }
            return ret;
        }
    }tree[2*S];
    void update(int node, int s, int e, int l, int r) {
        if (s==e) {
            tree[node].p=s, tree[node].s=1, tree[node].g[0][0]=f[s], tree[node].g[0][1]=1;
            return;
        }
        if (s>r || l>e) return;
        int lch=2*node, rch=lch+1, m=(s+e)/2;
        update(lch, s, m, l, r), update(rch, m+1, e, l, r);
        tree[node]=tree[lch]+tree[rch];
    }
    Node query(int node, int s, int e, int l, int r) {
        if (l<=s && e<=r) return tree[node];
        int lch=2*node, rch=lch+1, m=(s+e)/2;
        if (r<=m) return query(lch, s, m, l, r);
        if (l>m) return query(rch, m+1, e, l, r);
        return query(lch, s, m, l, r)+query(rch, m+1, e, l, r);
    }
}T;
class seg2 {
public:
    void init() {
        for (int i=1; i<=n; i++) tree[i+S-1]=a[i];
        for (int i=S-1; i>=1; i--) tree[i]=tree[i<<1]+tree[i<<1|1];
    }
    void update(int k, int v) {
        k+=S-1, tree[k]=v;
        for (k>>=1; k; k>>=1) tree[k]=tree[k<<1]+tree[k<<1|1];
    }
    int query(int l, int r) {
        int ret=0;
        for (l+=S-1, r+=S-1; l<r; l>>=1, r>>=1) {
            if (l&1) ret+=tree[l++];
            if (!(r&1)) ret+=tree[r--];
        }
        if (l==r) ret+=tree[l];
        return ret;
    }
private:
    int tree[2*S];
}T2;
void init() {
    f[n+1]=n+1;
    for (int i=n; i>=1; i--) {
        f[i]=n+1;
        for (int j=i+2, sum=a[i+1]; j<=min(i+50, n); sum+=a[j++]) if (sum>a[i] && sum>a[j]) {
            f[i]=j; break;
        }
        f[i]=min(f[i], f[i+1]);
    }
    T.init(), T2.init();
}
void update(int k, int v) {
    a[k]=v, T2.update(k, v);
    for (int i=k; i>=max(1ll, k-50); i--) {
        f[i]=n+1;
        for (int j=i+2, sum=a[i+1]; j<=min(n, i+50); sum+=a[j++]) if (sum>a[i] && sum>a[j]) {
            f[i]=j; break;
        }
        f[i]=min(f[i], f[i+1]);
    }
    T.update(max(1ll, k-50), k);
}
int query2(int l, int r) {
    if (r-l+1<3) return -10;
    return T.query(l, r);
}
int query(int l, int r) {
    int ret=1;
    if (T2.query(l, r-1)>a[r]) ret=2;
    if (T2.query(l+1, r)>a[l]) ret=2;
    int ll=r+1, rr=l-1;
    for (int i=l+1, sum=a[l]; i<=r; sum+=a[i++]) if (sum>a[i]) {
        ll=i; break;
    }
    for (int i=r-1, sum=a[r]; i>=l; sum+=a[i--]) if (sum>a[i]) {
        rr=i; break;
    }
    if (ll<=rr) ret=3;
    return max({ret, query2(l, r), query2(ll, r)+1, query2(l, rr)+1, query2(ll, rr)+2});
}
signed main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin>>n;
    for (int i=1; i<=n; i++) cin>>a[i];
    init();
    cin>>q;
    while (q--) {
        int k, v, l, r; cin>>k>>v>>l>>r;
        l++;
        update(k, v), cout<<query(l, r)<<"\n";
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |