Cod sursa(job #600165)

Utilizator SpiderManSimoiu Robert SpiderMan Data 30 iunie 2011 17:47:06
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
# include <cstdio>

const char *FIN = "sequencequery.in", *FOU = "sequencequery.out";
const int MAX = 1 << 18, MAX_A = 1 << 19;

int N, T, V[MAX];
long long A[MAX_A], B[MAX_A], C[MAX_A], D[MAX_A], sum, sol;

inline long long max (long long a, long long b) {
    return (a > b ? a : b);
}

void buildtree (int nod, int st, int dr) {
    if (st == dr) {
        A[nod] = B[nod] = C[nod] = D[nod] = V[st];
        return ;
    }
    int mij = st + dr >> 1;
    buildtree (nod << 1, st, mij);
    buildtree ((nod << 1) + 1, mij + 1, dr);
    A[nod] = max (A[nod << 1], D[nod << 1] + A[(nod << 1) + 1]);
    B[nod] = max (B[nod << 1] + D[(nod << 1) + 1], B[(nod << 1) + 1]);
    C[nod] = max (max (C[nod << 1], C[(nod << 1) + 1]), B[nod << 1] + A[(nod << 1) + 1]);
    D[nod] = D[nod << 1] + D[(nod << 1) + 1];
}

void query (int nod, int st, int dr, int s1, int s2) {
    if (s1 <= st && dr <= s2) {
        sum = max (sum, 0);
        sol = max (sol, max (sum + A[nod], C[nod]));
        sum = max (sum + D[nod], B[nod]);
        return ;
    }
    int mij = st + dr >> 1;
    if (s1 <= mij) query (nod << 1, st, mij, s1, s2);
    if (s2 > mij)  query ((nod << 1) + 1, mij + 1, dr, s1, s2);
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d", &N, &T);
    for (int i = 1; i <= N; ++i)
        scanf ("%d", V + i);
    buildtree (1, 1, N);
    for (int x, y; T; --T) {
        scanf ("%d %d", &x, &y);
        sum = 0, sol = -0x3f3f3f3f;
        query (1, 1, N, x, y);
        printf ("%lld\n", sol);
    }
}