Cod sursa(job #81763)

Utilizator DastasIonescu Vlad Dastas Data 4 septembrie 2007 11:05:50
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>

const int maxn = 100001;
const long long inf = 100000000000LL;


FILE *in = fopen("sequencequery.in","r"), *out = fopen("sequencequery.out","w");

int n, m;
int a[maxn];

long long A[2<<17];
long long B[2<<17];
long long C[2<<17];
long long Sum[2<<17];

long long max(long long a, long long b)
{
    if ( a > b )
        return a;
    else
        return b;
}

void build(int nod, int st, int dr)
{
    if ( st == dr )
    {
        A[nod] = B[nod] = C[nod] = Sum[nod] = a[st];
        return;
    }

    int q = nod << 1;
    int m = (st + dr) >> 1;

    build(q, st, m);
    build(q+1, m+1, dr);

    A[nod] = max(A[q], Sum[q] + A[q+1]);
    B[nod] = max(B[q] + Sum[q+1], B[q+1]);
    C[nod] = max(max(C[q], C[q+1]), B[q]+A[q+1]);

    Sum[nod] = Sum[q] + Sum[q+1];
}

int p1, p2;
long long S, answ;

void query(int nod, int st, int dr)
{
    if ( dr < p1 || st > p2 )
        return;

    if ( p1 <= st && dr <= p2 )
    {
        answ = max(answ, max(S + A[nod], C[nod]));
        S = max(S + Sum[nod], B[nod]);

        return;
    }

    if ( st == dr )
        return;

    int q = nod << 1;
    int m = (st + dr) >> 1;

    query(q, st, m);
    query(q+1, m+1, dr);
}

int main()
{
    fscanf(in, "%d %d", &n, &m);

    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &a[i]);

    build(1, 1, n);
    int t, d;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d", &t, &d);
        p1 = t;
        p2 = d;

        answ = -inf;
        S = -inf;
        query(1, 1, n);
        fprintf(out, "%lld\n", answ);
    }

	return 0;
}