Cod sursa(job #606935)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 10 august 2011 14:31:24
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <cstdio>

#define NMax 200005

using namespace std;

typedef struct
{
    long long S;
    long long L;
    long long R;
    long long M;
}
ArbInt;

ArbInt AI[4*NMax];
int N;

inline long long Max (long long a, long long b)
{
    if (a>b)
    {
        return a;
    }
    return b;
}

inline void Reunite (ArbInt &A, ArbInt AL, ArbInt AR)
{
    A.S=AL.S+AR.S;
    A.L=Max (AL.L, AL.S+AR.L);
    A.R=Max (AR.R, AR.S+AL.R);
    A.M=Max (Max (AL.M, AR.M), AL.R+AR.L);
}

void Update (int K, int L, int R, int P, long long V)
{
    int Mid=(L+R)/2;
    if (L==R)
    {
        AI[K].S=AI[K].L=AI[K].R=AI[K].M=V;
        return;
    }
    if (P<=Mid)
    {
        Update (2*K, L, Mid, P, V);
    }
    else
    {
        Update (2*K+1, Mid+1, R, P, V);
    }
    Reunite (AI[K], AI[2*K], AI[2*K+1]);
}

ArbInt Query (int K, int L, int R, int QL, int QR)
{
    int Mid=(L+R)/2;
    if (L==QL and R==QR)
    {
        return AI[K];
    }
    if (QR<=Mid)
    {
        return Query (2*K, L, Mid, QL, QR);
    }
    if (QL>Mid)
    {
        return Query (2*K+1, Mid+1, R, QL, QR);
    }
    ArbInt Q1=Query (2*K, L, Mid, QL, Mid);
    ArbInt Q2=Query (2*K+1, Mid+1, R, Mid+1, QR);
    ArbInt Q;
    Reunite (Q, Q1, Q2);
    return Q;
}

int main()
{
    freopen ("sequencequery.in", "r", stdin);
    freopen ("sequencequery.out", "w", stdout);
    int NQ;
    scanf ("%d %d", &N, &NQ);
    for (int i=1; i<=N; ++i)
    {
        int X;
        scanf ("%d", &X);
        Update (1, 1, N, i, (long long)X);
    }
    for (; NQ>0; --NQ)
    {
        int X, Y;
        scanf ("%d %d", &X, &Y);
        ArbInt Q=Query (1, 1, N, X, Y);
        printf ("%lld\n", Q.M);
    }
    return 0;
}