Cod sursa(job #1474418)

Utilizator akaprosAna Kapros akapros Data 21 august 2015 22:40:50
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 200004
#define inf 2000000000
using namespace std;
int i, p, q, n, m, v[maxN], s[maxN], sb[maxN], se[maxN], S[maxN], smax, sum;
inline int left_son(int x)
{
    return 2 * x;
}
inline int right_son(int x)
{
    return 2 * x + 1;
}
void update(int node, int left, int right)
{
    int mid = (left + right) / 2;
    if (left == right)
    {
        S[node] = s[node] = sb[node] = se[node] = q;
        return;
    }
    if (p <= mid)
        update(left_son(node), left, mid);
    else
        update(right_son(node), mid + 1, right);

    S[node] = S[left_son(node)] + S[right_son(node)];
    sb[node] = max(sb[left_son(node)], S[left_son(node)] + sb[right_son(node)]);
    se[node] = max(se[right_son(node)], S[right_son(node)] + se[left_son(node)]);
    s[node] = max(s[left_son(node)], s[right_son(node)]);
    s[node] = max(s[node], se[left_son(node)] + sb[right_son(node)]);
}
void query(int node, int left, int right)
{
    int mid = (left + right) / 2;
    if (p <= left && q >= right)
    {
        smax = max(smax, max(s[node], sum + sb[node]));
        sum = max(sum + S[node], se[node]);
        return;
    }
    if (p <= mid)
        query(left_son(node), left, mid);
    if (q >= mid + 1)
        query(right_son(node), mid + 1, right);
}
void read()
{
    freopen("sequencequery.in", "r", stdin);
    scanf("%d %d", &n, &m);

    for (i = 1; i <= n; ++ i)
    {
        scanf("%d", &v[i]);
        p = i; q = v[i];
        update(1, 1, n);
    }
}
void write()
{
    freopen("sequencequery.out", "w", stdout);
    while (m --)
    {
        scanf("%d %d", &p, &q);
        smax = -inf;
        sum = 0;
        query(1, 1, n);
        printf("%d\n", smax);
    }
}
int main()
{
    read();
    write();
    return 0;
}