Cod sursa(job #2295821)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 3 decembrie 2018 22:59:19
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <climits>
#define DIM 100005

using namespace std;

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

long long n, i, a, b, v[DIM], m, sol, s;

struct tetracloruraDeCarbon{
    long long all, ssm, sst, ddr;
} A[4*DIM];

inline void build (int nod, int st, int dr){
    int mid;
    if (st == dr){
        fin >> v[st];
        A[nod].ssm = v[st];
        A[nod].sst = v[st];
        A[nod].ddr = v[st];
        A[nod].all = v[st];
    }
    else{
        mid = st + (dr - st)/2;
        build (2*nod, st, mid);
        build (2*nod+1, mid+1, dr);
        A[nod].all = A[2*nod].all + A[2*nod+1].all;
        A[nod].ssm = max (A[2*nod].ssm, max (A[2*nod+1].ssm, A[2*nod].ddr + A[2*nod+1].sst));
        A[nod].sst = max (A[2*nod].sst, A[2*nod].all + A[2*nod+1].sst);
        A[nod].ddr = max (A[2*nod+1].ddr, A[2*nod].ddr + A[2*nod+1].all);
    }
}

inline void query (int nod, int st, int dr, int a, int b){
    int mid;
    if (a <= st && b >= dr){
        sol = max (A[nod].ssm, max (sol, s + A[nod].sst));
        s = max ((s + A[nod].all), A[nod].ddr);
        sol = max (sol, s);
    }
    else{
        mid = st + (dr - st)/2;
        if (a <= mid){
            query (2*nod, st, mid, a, b);
        }
        if (b > mid){
            query (2*nod+1, mid+1, dr, a, b);
        }
    }
}

int main(){
    fin >> n >> m;
    build (1, 1, n);
    for (i=1; i<=m; i++){
        fin >> a >> b;
        sol = INT_MIN, s = INT_MIN;
        query (1, 1, n, a, b);
        fout << sol << "\n";
    }
    return 0;
}