Cod sursa(job #989870)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 26 august 2013 17:36:37
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <cstdio>
#include <algorithm>
#define l first
#define r second
using namespace std;

const int NMAX = 100003, INFI = 2e9;

pair <int, int> AIB[NMAX * 3];
long long S[NMAX], s, best;
int V[NMAX], _left, _right, last_i;
bool first_time;

void AIB_query (const int &node, const int &left, const int &right) {

    if (left >= _left && right <= _right) {
        if (first_time) {
            first_time = 0;
            last_i = AIB[node].r;
            s = S[last_i] - S[AIB[node].l - 1];
            if (s > best)
                best = s;
            return;
        }
        if (s < 0)
            s = 0,
            last_i = AIB[node].l - 1;
        if (S[AIB[node].r] - S[last_i] > S[AIB[node].r] - S[AIB[node].l - 1])
            s += S[AIB[node].r] - S[last_i];
        else
            s = S[AIB[node].r] - S[AIB[node].l - 1];
        if (s > best)
            best = s;
        last_i = AIB[node].r;
        return;
    }
    if (left > _right || right < _left)
        return;
    int middle = left + right >> 1;
    AIB_query (node * 2, left, middle);
    AIB_query (node * 2 + 1, middle + 1, right);

}

void AIB_build (const int &node, const int &left, const int &right) {

    if (left == right) {
        AIB[node] = make_pair (left, left);
        return;
    }
    const int &middle = left + right >> 1;
    AIB_build (node * 2, left, middle);
    AIB_build (node * 2 + 1, middle + 1, right);
    int l = S[AIB[node * 2 + 1].r] - S[AIB[node * 2 + 1].l - 1], r = S[AIB[node * 2].r] - S[AIB[node * 2].l - 1], b = S[AIB[node * 2 + 1].r] - S[AIB[node * 2].l - 1];
    if (b > l && b > r)
        AIB[node] = make_pair (AIB[node * 2].l, AIB[node * 2 + 1].r);
    else
        if (r > l)
            AIB[node] = make_pair (AIB[node * 2].l, AIB[node * 2].r);
        else
            AIB[node] = make_pair (AIB[node * 2 + 1].l, AIB[node * 2 + 1].r);

}

int main () {

    freopen ("sequencequery.in", "r", stdin);
    freopen ("sequencequery.out", "w", stdout);
    int N, M, i;

    scanf ("%d%d", &N, &M);
    for (i = 1; i <= N; ++i)
        scanf ("%d", V + i),
        S[i] = S[i - 1] + V[i];
    AIB_build (1, 1, N);
    while (M--) {
        scanf ("%d%d", &_left, &_right);
        s = 0;
        best = -INFI;
        first_time = 1;
        AIB_query (1, 1, N);
        printf ("%d\n", best);
    }

}