Cod sursa(job #3201056)

Utilizator gBneFlavius Andronic gBne Data 6 februarie 2024 17:52:27
Problema SequenceQuery Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>

using namespace std;

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

const int OO = 100005;

int v[100005];

struct arb{
    int sumMax;
    int sumSt;
    int sumDr;
    int sumInt;
    arb(){
        sumSt = sumDr = sumMax = sumInt = -OO;
    }
    arb(int sumMax, int sumSt, int sumDr, int sumInt){
        this -> sumMax = sumMax;
        this -> sumSt = sumSt;
        this -> sumDr = sumDr;
        this -> sumInt = sumInt;

    }
} A[400005];

void build(int nod, int st, int dr){
    if(st == dr){
        A[nod].sumMax = A[nod].sumSt = A[nod].sumDr = A[nod].sumInt = v[st];
    }
    else{
        int mij = (st + dr) / 2;
        int nodSt = 2 * mij, nodDr = 2 * mij + 1;
        build(nodSt, st, mij);
        build(nodDr, mij + 1, dr);
        A[nod].sumMax = max(max(A[nodSt].sumMax, A[nodDr].sumMax), A[nodDr].sumSt + A[nodSt].sumDr);
        A[nod].sumSt = max(A[nodSt].sumSt, A[nodSt].sumInt + A[nodDr].sumSt);
        A[nod].sumDr = max(A[nodDr].sumDr, A[nodDr].sumInt + A[nodSt].sumDr);
        A[nod].sumInt = A[nodSt].sumInt + A[nodDr].sumInt;
    }
}

arb query(int nod, int st, int dr, int qst, int qdr){
    if(st >= qst && dr <= qdr){
        return A[nod];
    }
    else{
        int mij = (st + dr) / 2;
        int nodSt = 2 * mij, nodDr = 2 * mij + 1;
        arb q1, q2;
        if(qst <= mij){
            q1 = query(nodSt, st, mij, qst, qdr);
        }
        if(qdr > mij){
            q2 = query(nodDr, mij + 1, dr, qst, qdr);
        }
        arb qAns(max(max(q1.sumMax, q2.sumMax), q1.sumDr + q2.sumSt),
                 max(q1.sumSt, q1.sumInt + q2.sumSt),
                 max(q2.sumDr, q1.sumDr + q2.sumInt),
                 q1.sumInt + q2.sumInt
                 );
        return qAns;
    }
}

int main()
{
    int n, m;
    fin >> n >> m;
    for(int i=1; i<=n; i++){
        fin >> v[i];
    }
    build(1, 1, n);
    for(int a, b, i=1; i<=m; i++){
        fin >> a >> b;
        fout << query(1, 1, n, a, b).sumMax << '\n';
    }
    return 0;
}