Cod sursa(job #2394528)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 1 aprilie 2019 18:22:32
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <cstdio>

#define N 100005

using namespace std;

struct Nod{
    long long val, prefix, sufix, total;
    Nod(){;}
    Nod(int _val){
        val = prefix = sufix = total = _val;
    }
}arbint[4*N];

int v[N], n, m, x, y;

Nod actualizareNod(Nod st, Nod dr){
    Nod r;

    r.total = st.total + dr.total;
    r.val = max(max(st.val,dr.val),
                st.sufix+dr.prefix);
    r.prefix = max(st.prefix, st.total + dr.prefix);
    r.sufix = max(dr.sufix, dr.total + st.sufix);

    return r;
}

void construieste(int st = 1, int dr = n, int pos = 1){
    if(st == dr){
        arbint[pos]=Nod(v[dr]);
        return;
    }

    int mij = (st+dr)/2;

    construieste(st,mij,2*pos);
    construieste(mij+1,dr,2*pos+1);

    arbint[pos] = actualizareNod(arbint[2*pos],arbint[2*pos+1]);
}

Nod cauta(int qst, int qdr, int st = 1, int dr = n, int pos = 1){
    if(qst<=st && dr<=qdr)
        return arbint[pos];

    int mij = (st+dr)/2;

    if(qdr<=mij)
        return cauta(qst,qdr,st,mij,2*pos);
    if(mij<qst)
        return cauta(qst,qdr,mij+1,dr,2*pos+1);

    return actualizareNod(cauta(qst,qdr,st,mij,2*pos),
                    cauta(qst,qdr,mij+1,dr,2*pos+1));
}

int main()
{
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);

    scanf("%d%d", &n,&m);
    for(int i=1;i<=n;++i)
        scanf("%d", &v[i]);

    construieste();

    for(int i=0;i<m;++i){
        scanf("%d%d", &x,&y);
        cout<<cauta(x,y).val<<"\n";
    }

    return 0;
}