Cod sursa(job #3363298)

Utilizator stefan_ciureaStefan Ciurea stefan_ciurea Data 15 august 2026 23:06:59
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
// #pragma GCC optimize("O3,unroll-loops,fast-math")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second

using namespace std;

const int Nmax=2e5+5,inf=1e9,MOD=1e9+7;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

struct AINT {
    struct Node {
        int sum,pref,suff,ssm;
    };
    int n;
    vector<Node> aint;
    void init(int _n) {
        n=_n;
        aint.resize(4*n+5);
    }
    void push(int node) {
        aint[node].sum=aint[2*node].sum+aint[2*node+1].sum;
        aint[node].pref=max(aint[2*node].pref,aint[2*node].sum+aint[2*node+1].pref);
        aint[node].suff=max(aint[2*node+1].suff,aint[2*node+1].sum+aint[2*node].suff);
        aint[node].ssm=max({aint[2*node].ssm,aint[2*node+1].ssm,aint[2*node].suff+aint[2*node+1].pref});
    }
    void build(int node, int st, int dr) {
        if (st==dr) {
            int x;
            fin>>x;
            aint[node]={x,x,x,x};
            return;
        }
        int mij=(st+dr)/2;
        build(2*node,st,mij);
        build(2*node+1,mij+1,dr);
        push(node);
    }
    Node merge(Node a, Node b) {
        Node rez;
        rez.sum=a.sum+b.sum;
        rez.pref=max(a.pref,a.sum+b.pref);
        rez.suff=max(b.suff,b.sum+a.suff);
        rez.ssm=max({a.ssm,b.ssm,a.suff+b.pref});
        return rez;
    }
    Node query(int node, int st, int dr, int l, int r) {
        if (st>=l && dr<=r) return aint[node];
        int mij=(st+dr)/2;
        if (l>mij) return query(2*node+1,mij+1,dr,l,r);
        if (r<=mij) return query(2*node,st,mij,l,r);
        return merge(query(2*node,st,mij,l,r),query(2*node+1,mij+1,dr,l,r));
    }
} aint;

signed main() {
    
    int n,t;
    fin>>n>>t;
    aint.init(n);
    aint.build(1,1,n);
    while (t--) {
        int x,y;
        fin>>x>>y;
        fout<<aint.query(1,1,n,x,y).ssm<<"\n";
    }
    return 0;
}