Cod sursa(job #2949848)

Utilizator carinamariaCarina Maria Viespescu carinamaria Data 1 decembrie 2022 22:01:29
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
using namespace std;
ifstream cin("sequencequery.in");
ofstream cout("sequencequery.out");
long long i, j, n, m, cer, t, sol, a, b;
long long v[800010];
struct nod{
  long long sum; // suma subsecventei
  long long pref_maxx; // prefixul de suma maxima
  long long suf_maxx; // sufixul de suma maxima
  long long maxx; // subsecventa de suma maxima
} A[800010];
nod update_nod( nod nodst, nod noddr){
    nod node;
    node.sum=nodst.sum+noddr.sum;
    node.pref_maxx=max(nodst.pref_maxx, nodst.sum+noddr.pref_maxx);
    node.suf_maxx=max(noddr.suf_maxx, noddr.sum+nodst.suf_maxx);
    node.maxx=max(max(nodst.maxx, noddr.maxx), nodst.suf_maxx+noddr.pref_maxx);
    return node;
}
/*
void update(long long nod, long long st, long long dr, long long poz, long long val){
    if(st==dr){
        A[nod].sum=val;
        A[nod].pref_maxx=val;
        A[nod].suf_maxx=val;
        A[nod].maxx=val;
        //cout<<nod<<" "<<A[nod].sum<<" "<<A[nod].pref_maxx<<" "<<A[nod].suf_maxx<<" "<<A[nod].maxx<<"\n";
    }
    else{
        long long mid=(st+dr)/2;
        if(poz<=mid)
            update(2*nod, st, mid, poz, val);
        else
            update(2*nod+1, mid+1, dr, poz, val);
        A[nod]=update_nod(A[2*nod], A[2*nod+1]);

       // cout<<nod<<" "<<A[nod].sum<<" "<<A[nod].pref_maxx<<" "<<A[nod].suf_maxx<<" "<<A[nod].maxx<<"\n";
    }

}
*/
void build(long long nod, long long st, long long dr){
    if(st==dr){
        A[nod].sum=v[st];
        A[nod].pref_maxx=v[st];
        A[nod].suf_maxx=v[st];
        A[nod].maxx=v[st];
        //cout<<nod<<" "<<A[nod].sum<<" "<<A[nod].pref_maxx<<" "<<A[nod].suf_maxx<<" "<<A[nod].maxx<<"\n";
    }
    else{
        long long mid=(st+dr)/2;
        build(2*nod, st, mid);
        build(2*nod+1, mid+1, dr);
        A[nod]=update_nod(A[2*nod], A[2*nod+1]);
       // cout<<nod<<" "<<A[nod].sum<<" "<<A[nod].pref_maxx<<" "<<A[nod].suf_maxx<<" "<<A[nod].maxx<<"\n";
    }
}
nod query(long long nod, long long st, long long dr, long long a, long long b){
    if(a<=st && dr<=b){
       return A[nod];
    }
    else{
        long long mid=(st+dr)/2;
        if(b<=mid)
            return query(2*nod, st, mid, a, b);
        if(mid+1<=a)
            return query(2*nod+1, mid+1, dr, a, b);
       return update_nod(query(2*nod, st, mid, a, b), query(2*nod+1, mid+1, dr, a, b));
    }
}
int main() {
    cin>>n>>t;
    for(i=1;i<=n;i++){
        cin>>v[i];
    }
    build(1, 1, n);
    for(i=1;i<=t;i++){
        cin>>a>>b;
        cout<<query(1, 1, n, a, b).maxx<<"\n";
    }


}