Cod sursa(job #67251)

Utilizator vlad_popaVlad Popa vlad_popa Data 23 iunie 2007 16:06:00
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
using namespace std;

#include <cstdio>
#include <algorithm>
#include <cassert>

#define FIN "sequencequery.in"
#define FOUT "sequencequery.out"
#define NMAX 1<<17
#define max(a, b) ((a) > (b) ? (a) : (b))
#define INF 0x3f3f3f3f

int N, M, v[NMAX], A[NMAX<<1], B[NMAX<<1], C[NMAX<<1], S[NMAX<<1];

#define mj ((st + dr)>>1)
#define ns (nod<<1)
#define nr (ns + 1)

void build (int nod, int st, int dr)
{
    if (st == dr)
    {
        A[nod] = B[nod] = C[nod] = v[st];
        S[nod] = v[st];
    }
    else
    {
        build (ns, st, mj);
        build (nr, mj + 1, dr);

        A[nod] = max (A[ns], S[ns] + A[nr]);
        B[nod] = max (B[nr], S[nr] + B[ns]);
        C[nod] = max (max (C[nr], C[ns]), A[nr] + B[ns]);

        S[nod] = S[nr] + S[ns];
    }
}

void read ()
{
    scanf ("%d %d\n", &N, &M);

    for (int i = 1; i <= N; ++ i)
        scanf ("%d ", v + i);

    build (1, 1, N);
}

void update (int nod, int st, int dr, int p, int x)
{
    if (st == dr)
    {
        v[st] = x;
        A[nod] = B[nod] = C[nod] = x;
        S[nod] = x;
    }
    else
    {
        if (p <= mj)
            update (ns, st, mj, p, x);
        else
            update (nr, mj + 1, dr, p, x);

        A[nod] = max (A[ns], S[ns] + A[nr]);
        B[nod] = max (B[nr], S[nr] + B[ns]);
        C[nod] = max (max (C[nr], C[ns]), A[nr] + B[ns]);

        S[nod] = S[nr] + S[ns];
    }
}

long long sol, Sum;

void query (int nod, int st, int dr, int a, int b)
{
    if (a <= st && dr <= b)
    {
        sol = max (sol, max (Sum + A[nod], C[nod]));
        Sum = max (Sum + S[nod], B[nod]);
    }
    else
    {
        if (a <= mj)
            query (ns, st, mj, a, b);
        if (b > mj)
            query (nr, mj + 1, dr, a, b);
    }
}

void solve ()
{
    int a, b;
    while (M--)
    {
        sol = Sum = -INF;
        scanf ("%d %d\n", &a, &b);
        
        query (1, 1, N, a, b);
        printf ("%lld\n", sol);
    }
}

int
 main ()
{
    freopen (FIN, "rt", stdin);
    freopen (FOUT, "wt", stdout);

    read ();
    solve ();

    return 0;
}