Cod sursa(job #2920206)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 22 august 2022 18:46:58
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>

using namespace std;

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

#define int long long

struct node
{
    int sum, suf, pref, maxim;
};

int max5 (int a, int b, int c, int d, int e)
{
    return max(a, max(b, max(c, max(d, e))));
}

class SegTree
{
protected:
    int n;
    vector<node>a;
public:
    void init (int N)
    {
        n = 1;
        while (n < N)
            n <<= 1;
        n <<= 1;
        n++;
        a.resize(n);
    }

    node merge_nodes (node st, node dr)
    {
        node p;

        p.sum = st.sum + dr.sum;
        p.pref = max(st.pref, st.sum + dr.pref);
        p.suf = max(dr.suf, dr.sum + st.suf);

        p.maxim = max5(st.maxim, dr.maxim, st.suf + dr.pref, st.suf, dr.pref);

        return p;
    }

    void build (int nod, int st, int dr)
    {
        if (st == dr)
        {
            int x;
            in >> x;
            a[nod] = {x, x, x, x};
        }
        else
        {
            int mid = (st + dr) / 2;

            int ls = 2*nod, rs = ls+1;

            build(ls, st, mid);
            build(rs, mid+1, dr);

            a[nod] = merge_nodes(a[ls], a[rs]);
        }
    }

    node query (int nod, int st, int dr, int l, int r)
    {
        if (l <= st && dr <= r)
            return a[nod];
        int mid = (st + dr) / 2;

        if (l <= mid && mid < r)
        {
            node ls = query(2*nod, st, mid, l, r);
            node rs = query(2*nod+1, mid+1, dr, l, r);

            return merge_nodes(ls, rs);
        }
        else if (l <= mid)
            return query(2*nod, st, mid, l, r);
        else if (mid < r)
            return query(2*nod+1, mid+1, dr, l, r);
    }
};

signed main()
{
    int n, q;
    in >> n >> q;

    SegTree ST;

    ST.init(n);

    ST.build(1, 1, n);

    while (q--)
    {
        int x, y;
        in >> x >> y;

        out << ST.query(1, 1, n, x, y).maxim << '\n';
    }

    return 0;
}