Cod sursa(job #3137668)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 14 iunie 2023 11:20:18
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <bits/stdc++.h>

using namespace std;

const long long inf= 1e11;
int n, m;
vector <int> a;

struct node
{
    long long left, right, sum, v;
};

class SegmentTree
{
    vector <node> t;

    node mergeNodes(const node &x, const node &y)
    {
        node ans;
        ans.v = max(max(x.right + y.left, x.v), y.v);
        ans.sum = x.sum + y.sum;
        ans.right = y.right;
        if(y.right == y.sum)
             ans.right += max(x.right, 0ll);
        ans.left = x.left;
        if(x.left == x.sum)
             ans.left += max(y.left, 0ll);
        return ans;
    }

public :
    SegmentTree(int x)
    {
        t.resize(4 * x + 1);
    }

    void build(vector <int> &a, int v, int l, int r)
    {
        if(l == r)
        {
            t[v].left = a[l];
            t[v].right = a[l];
            t[v].sum = a[l];
            t[v].v = a[l];
            return;
        }
        int m = (l + r) / 2;
        build(a, 2 * v, l, m);
        build(a, 2 * v + 1, m + 1, r);
        t[v] = mergeNodes(t[2 * v], t[2 * v + 1]);
    }

    node query(int v, int l, int r, int tl, int tr)
    {
        if(tl > tr)
            return {-inf, -inf, 0, -inf};
        if(l == tl  &&  r == tr)
            return t[v];
        int m = (l + r) / 2;
        return mergeNodes(query(2 * v, l, m, tl, min(m, tr)),
                          query(2 * v + 1, m + 1, r, max(m + 1, tl), tr));
    }

    void print(int v, int l, int r)
    {
        if(l == r)
        {
            cout << l << " " << r << " " << t[v].left << " " << t[v].right << " " << t[v].sum << " " << t[v].v << "\n";
            return;
        }
        int m = (l + r) / 2;
        print(2 * v, l, m);
        print(2 * v + 1, m + 1, r);
        cout << l << " " << r << " " << t[v].left << " " << t[v].right << " " << t[v].sum << " " << t[v].v << "\n";
    }

};

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("sequencequery.in", "r", stdin);
    freopen("sequencequery.out", "w", stdout);

    cin >> n >> m;
    a.resize(n + 1);
    SegmentTree aint(n);

    for(int i = 1; i <= n; i ++)
        cin >> a[i];

    aint.build(a, 1, 1, n);
//    aint.print(1, 1, n);
    for(int i = 1; i <= m; i ++)
    {
        int x, y;
        cin >> x >> y;
        cout << aint.query(1, 1, n, x, y).v << "\n";
    }
    return 0;
}