Cod sursa(job #2514844)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 26 decembrie 2019 22:40:55
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>
using namespace std;

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

class SegmTree {
  private:
    struct Node {
        int64_t sumAll, maxSum;
        int64_t maxLeft, maxRight;

        Node(int64_t val = 0) {
            sumAll = maxSum = maxLeft = maxRight = val;
        }

        Node operator+(Node right) {
            Node ret;
            ret.sumAll = sumAll + right.sumAll;
            ret.maxSum = max(maxRight + right.maxLeft, max(maxSum, right.maxSum));
            ret.maxLeft = max(maxLeft, sumAll + right.maxLeft);
            ret.maxRight = max(right.maxRight, right.sumAll + maxRight);
            return ret;
        }
    };

    int n;
    vector<Node> tree;

    void build(int node, int left, int right, vector<int64_t>& v) {
        if (left == right) {
            tree[node] = Node(v[left]);
            return;
        }

        int mid = (left + right) / 2;
        build(2 * node, left, mid, v);
        build(2 * node + 1, mid + 1, right, v);
        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }

    Node query(int node, int left, int right, int qLeft, int qRight) {
        if (left == qLeft && right == qRight)
            return tree[node];

        int mid = (left + right) / 2;
        if (qRight <= mid)
            return query(2 * node, left, mid, qLeft, qRight);
        if (qLeft > mid)
            return query(2 * node + 1, mid + 1, right, qLeft, qRight);

        return query(2 * node, left, mid, qLeft, mid) +
               query(2 * node + 1, mid + 1, right, mid + 1, qRight);
    }

  public:
    SegmTree(vector<int64_t>& v) {
        n = v.size() - 1;
        tree.resize(4 * n);
        build(1, 1, n, v);
    }

    int64_t query(int left, int right) {
        return query(1, 1, n, left, right).maxSum;
    }
};

int main() {
    int n, q;
    fin >> n >> q;

    vector<int64_t> v(n + 1);
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    SegmTree tree(v);

    for (int i = 0; i < q; i++) {
        int x, y; fin >> x >> y;
        fout << tree.query(x, y) << '\n';
    }

    fout.close();
    return 0;
}