Cod sursa(job #1584789)

Utilizator LucianTLucian Trepteanu LucianT Data 30 ianuarie 2016 14:43:33
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
//ineficient
#include <cstdio>
#include <algorithm>
#define maxN 400005
#define INF 100000000000LL
using namespace std;
int n, m, i;
long long s1[maxN], s2[maxN], v[maxN], s[maxN], arb[maxN], maxx, sum, j, val, poz, start, stop;
void update(int nod, int st, int dr)
{
    if(st == dr)
    {
        arb[nod] = s[nod] = s1[nod] = s2[nod] = val;
        return;
    }
    int mij = (st+dr)/2;
    if(poz <= mij) update((nod<<1), st, mij);
    else update((nod<<1)+1, mij+1, dr);
    arb[nod] = arb[(nod<<1)] + arb[(nod<<1)+1];
    s1[nod] = max(s1[(nod<<1)], arb[(nod<<1)] + s1[(nod<<1)+1]);
    s2[nod] = max(s2[(nod<<1)+1], arb[(nod<<1)+1] + s2[(nod<<1)]);
    s[nod] = max(s[(nod<<1)], s[(nod<<1)+1]);
    s[nod] = max(s[nod], s2[(nod<<1)] + s1[(nod<<1)+1]);
}
void query(int nod, int st, int dr)
{
    int mij = (st+dr)/2;
    if(st >= start && dr <= stop)
    {
        maxx = max(maxx, max(s[nod], sum+s1[nod]));
        sum = max(sum+arb[nod], s2[nod]);
        return;
    }
    if(start <= mij) query((nod<<1), st, mij);
    if(mij+1 <= stop) query((nod<<1)+1, mij+1, dr);
}
int main()
{
    freopen("sequencequery.in", "r", stdin);
    freopen("sequencequery.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i = 1; i <= n; i++)
    {
        scanf("%lld", &v[i]);
        val = v[i], poz = i;
        update(1, 1, n);
    }
    while(m--)
    {
        scanf("%lld %lld", &start, &stop);
        maxx = -INF;
        sum = 0;
        query(1, 1, n);
        printf("%lld\n", maxx);
    }
    return 0;
}