Cod sursa(job #3362848)

Utilizator alex.iovita.23@gmail.comIovita Alexandru [email protected] Data 12 august 2026 15:27:19
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<bits/stdc++.h>
#define int long long
#define DIM 100000

using namespace std;

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

int n , m;
struct Iris{
    int sum , sufix , prefix , smax;
}aint[4 * DIM + 5];

inline Iris combine(Iris st , Iris dr){
    Iris rez;
    rez.sum = st.sum + dr.sum;
    rez.sufix = max(dr.sufix , dr.sum + st.sufix);
    rez.prefix = max(st.prefix , st.sum + dr.prefix);
    rez.smax = max({st.smax , dr.smax , st.sufix + dr.prefix});
    return rez;
}

inline void build(int nod , int st , int dr){
    if(st == dr){
        int x; fin >> x;
        aint[nod] = {x , x , x , x};
    }
    else{
        int mid = (st + dr) / 2;
        build(2 * nod , st , mid);
        build(2 * nod + 1 , mid + 1 , dr);
        aint[nod] = combine(aint[2 * nod] , aint[2 * nod + 1]);
    }
}

inline Iris query(int nod , int st ,int dr , int a , int b){
    if(a <= st && dr <= b) return aint[nod];
    else if(a > dr || st > b) return {0 , -10000000 , -10000000 , -10000000};
    else{
        int mid = (st + dr) / 2;
        return combine(query(2 * nod , st , mid , a , b) , query(2 * nod + 1 , mid + 1 , dr , a , b));
    }
}

signed main(){
    fin >> n >> m;
    build(1 , 1 , n);
    for(int i = 1 ; i <= m ; i++){
        int st , dr; fin >> st >> dr;
        Iris rez = query(1 , 1 , n , st , dr);
        fout << rez.smax << '\n';
    }
}