Cod sursa(job #2443600)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 28 iulie 2019 18:08:37
Problema SequenceQuery Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>

using namespace std;

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

constexpr int NMAX = 1e5 + 5;
constexpr int INF = 1e9 + 5;

struct arbore
{
    int sum;
    int dr;
    int st;
    int rez;
};

arbore aint[NMAX*4];

int n, m;

int a[NMAX];

void combin (arbore &a, arbore b, arbore c)
{
    a.sum = b.sum + c.sum;
    a.st = max(a.sum, max(b.st, b.sum + c.st));
    a.dr = max(a.sum, max(c.dr, c.sum + b.dr));
    a.rez = max(max(max(a.sum, max(a.st, a.dr)), max(b.rez, c.rez)), max(b.dr+c.st, max(b.dr, c.st)));
}

void update (int nod, int a, int b, int poz, int val)
{
    if (a==b)
    {
        aint[nod]={val, val, val, val};
        return;
    }
    int mij=(a+b)/2;

    if (poz <= mij) update(2*nod, a, mij, poz, val);
    else update(2*nod+1, mij+1, b, poz, val);

    combin(aint[nod], aint[2*nod], aint[2*nod+1]);
}

arbore query (int nod, int a, int b, int qa, int qb)
{
    if (qa <= a && b <= qb) return aint[nod];

    int mij=(a+b)/2;

    arbore nr_1={0, -INF, -INF, -INF};
    arbore nr_2={0, -INF, -INF, -INF};
    arbore aux={0, -INF, -INF, -INF};

    if (qa <= mij) nr_1=query(2*nod, a, mij, qa, qb);
    if (mij < qb) nr_2=query(2*nod+1, mij+1, b, qa, qb);

    combin(aux, nr_1, nr_2);

    return aux;
}

int main()
{
    f>>n>>m;

    for (int i=1; i<=n; ++i)
    {
        int x;
        f>>x;
        update(1, 1, n, i, x);
    }

    for (int i=1; i<=m; ++i)
    {
        int x, y;
        f>>x>>y;
        g<<query(1, 1, n, x, y).rez << '\n';
    }
    return 0;
}