Cod sursa(job #2787051)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 22 octombrie 2021 12:48:36
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <bits/stdc++.h>
#define DIM 100005
#define ll long long

using namespace std;

ifstream f("sequencequery.in");
ofstream g("sequencequery.out");

struct elem
{
    ll s, sdr, sst, smax;
}aint[4 * DIM];

int n, q, v[DIM];

void Build(int nod, int st, int dr)
{
    if(st == dr)
    {
        aint[nod] = {v[st], v[st], v[st], v[st]};
        return ;
    }

    int mid = (st + dr) / 2;
    Build(2 * nod, st, mid);
    Build(2 * nod + 1, mid + 1, dr);

    aint[nod].s = aint[2 * nod].s + aint[2 * nod + 1].s;
    aint[nod].sst = max(aint[2 * nod].sst, aint[2 * nod].s + aint[2 * nod + 1].sst);
    aint[nod].sdr = max(aint[2 * nod + 1].sdr, aint[2 * nod].sdr + aint[2 * nod + 1].s);
    aint[nod].smax = max(aint[2 * nod].smax, max(aint[2 * nod + 1].smax, aint[2 * nod].sdr + aint[2 * nod + 1].sst));
}

void Update(int nod, int st, int dr, int val, int poz)
{
    if(st == dr)
    {
        aint[nod] = {val, val, val, val};
        return ;
    }

    int mid = (st + dr) / 2;
    if(mid >= poz)
        Update(2 * nod, st, mid, val, poz);
    else
        Update(2 * nod + 1, mid + 1, dr, val, poz);


    aint[nod].s = aint[2 * nod].s + aint[2 * nod + 1].s;
    aint[nod].sst = max(aint[2 * nod].sst, aint[2 * nod].s + aint[2 * nod + 1].sst);
    aint[nod].sdr = max(aint[2 * nod + 1].sdr, aint[2 * nod].sdr + aint[2 * nod + 1].s);
    aint[nod].smax = max(aint[2 * nod].smax, max(aint[2 * nod + 1].smax, aint[2 * nod].sdr + aint[2 * nod + 1].sst));
}

elem Query(int nod, int st, int dr, int stQ, int drQ)
{
    if(stQ <= st && dr <= drQ)
    {
        return aint[nod];
    }

    int mid = (st + dr) / 2;
    bool okst = 0, okdr = 0;
    elem r, left, right;
    if(mid >= stQ)
    {
        left = Query(2 * nod, st, mid, stQ, drQ);
        okst = 1;
    }
    if(mid < drQ)
    {
        right = Query(2 * nod + 1, mid + 1, dr, stQ, drQ);
        okdr = 1;
    }

    if(okst == 0)
        return right;
    if(okdr == 0)
        return left;
    r.s = right.s + left.s;
    r.sst = max(left.sst, left.s + right.sst);
    r.sdr = max(right.sdr, left.sdr + right.s);
    r.smax = max(left.smax, max(right.smax, left.sdr + right.sst));

    return r;
}

int main()
{
    f >> n >> q;
    for(int i = 1; i <= n; i++)
        f >> v[i];
    Build(1, 1, n);

    for(; q; q--)
    {
        int x, y;
        f >> x >> y;
        g << Query(1, 1, n, x, y).smax << "\n";
    }

    return 0;
}