Cod sursa(job #1984277)

Utilizator savigunFeleaga Dragos-George savigun Data 24 mai 2017 12:45:09
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
#include <iostream>
#include <fstream>
using namespace std;

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

struct Node {
    long long sp = 0;
    long long stmax = -2e10;
    long long drmax = -2e10;
    long long smax = -2e10;
};

class SegmentTree {
public:
    Node *tree;
    int size;

    SegmentTree(int n) {
        size = n;
        tree = new Node[n * 4]();
    }

    void Update(int n, int start, int end, int pos, int val) {
        if (start == end) {
            tree[n].sp = val;
            tree[n].stmax = val;
            tree[n].drmax = val;
            tree[n].smax = val;
            return;
        }

        int mid = (start + end) / 2;
        if (pos <= mid)
            Update(n * 2, start, mid, pos, val);
        else
            Update(n * 2 + 1, mid + 1, end, pos, val);

        tree[n].sp = tree[n * 2].sp + tree[n * 2 + 1].sp;
        tree[n].stmax = max(tree[n * 2].stmax, tree[n * 2].sp + tree[n * 2 + 1].stmax);
        tree[n].drmax = max(tree[n * 2 + 1].drmax, tree[n * 2 + 1].sp + tree[n * 2].drmax);
        tree[n].smax = max(tree[n].smax, tree[n].stmax);
        tree[n].smax = max(tree[n].smax, tree[n].drmax);
        tree[n].smax = max(tree[n].smax, tree[n].sp);
        tree[n].smax = max(tree[n].smax, tree[n * 2].smax);
        tree[n].smax = max(tree[n].smax, tree[n * 2 + 1].smax);
        tree[n].smax = max(tree[n].smax, tree[n * 2].drmax + tree[n * 2 + 1].stmax);
    }

    Node Query(int n, int start, int end, int a, int b) {
        //cout << start << " " << end << " " << a << " " << b << endl;
        if (start >= a && end <= b) {
            return tree[n];
        }

        Node sol, left, right;
        int mid = (start + end) / 2;

        if (a <= mid) {
            left = Query(n * 2, start, mid, a, b);
        }
        if (b > mid) {
            right = Query(n * 2 + 1, mid + 1, end, a, b);
        }

        sol.sp = left.sp + right.sp;
        sol.stmax = max(left.stmax, left.sp + right.stmax);
        sol.drmax = max(right.drmax, right.sp + left.drmax);
        sol.smax = max(sol.smax, sol.stmax);
        sol.smax = max(sol.smax, sol.drmax);
        sol.smax = max(sol.smax, sol.sp);
        sol.smax = max(sol.smax, left.smax);
        sol.smax = max(sol.smax, right.smax);
        sol.smax = max(sol.smax, left.drmax + right.stmax);
        return sol;
    }
};


int n, m;
SegmentTree *T;


int main() {
    //in >> n;
    in >> n >> m;
    T = new SegmentTree(n);

    for (int i = 1, x; i <= n; ++i) {
        in >> x;
        T -> Update(1, 1, n, i, x);
    }


    //in >> m;
    for (int i = 1, o, x, y; i <= m; ++i) {
        //in >> o >> x >> y;
        in >> x >> y;
        /*if (o == 0) {
            T -> Update(1, 1, n, x + 1, y);
        } else {
            Node nod = T -> Query(1, 1, n, x + 1, y + 1);
            if (nod.smax < 0) out << 0 << '\n';
                else out << nod.smax << '\n';
        }*/
        Node nod = T -> Query(1, 1, n, x, y);
        out << nod.smax << '\n';
    }

}