Cod sursa(job #2155853)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 8 martie 2018 10:46:58
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#define DIM 100002
#define INF 2e18

using namespace std;

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

int n, m, v[DIM], x, y;
long long sdr, smax;

struct arbint{
    long long st, dr, smax, stot;
}aint[4 * DIM];

void build(int nod, int st, int dr){
    if(st == dr){
        aint[nod].st = v[st];
        aint[nod].dr = v[st];
        aint[nod].smax = v[st];
        aint[nod].stot = v[st];
        return;
    }

    int mid = (st + dr) / 2;

    build(nod<<1, st, mid);
    build(nod<<1|1, mid + 1, dr);

    aint[nod].stot = aint[nod<<1].stot + aint[nod<<1|1].stot;
    aint[nod].st = max(aint[nod<<1].st, aint[nod<<1].stot + aint[nod<<1|1].st);
    aint[nod].dr = max(aint[nod<<1|1].dr, aint[nod<<1|1].stot + aint[nod<<1].dr);
    aint[nod].smax = max(aint[nod<<1].dr + aint[nod<<1|1].st,max(aint[nod<<1].smax, aint[nod<<1|1].smax));
}

void query(int nod, int st, int dr, int a, int b){
    if(a <= st && b >= dr){
        smax = max(aint[nod].st + sdr, max(smax, aint[nod].smax));
        sdr = max(sdr + aint[nod].stot, aint[nod].dr);
        return;
    }

    int mid = (st + dr) / 2;

    if(a <= mid)
        query(nod<<1, st, mid, a, b);
    if(b > mid)
        query(nod<<1|1, mid + 1, dr, a, b);
}

int main()
{
    in>>n>>m;
    for(int i = 1; i <= n; ++ i)
        in>>v[i];
    build(1, 1, n);
    for(int i = 1; i <= m; ++ i){
        in>>x>>y;
        if(x > y)
            swap(x, y);
        sdr = -INF;
        smax = -INF;
        query(1, 1, n, x, y);
        out<<smax<<'\n';
    }
    return 0;
}