Cod sursa(job #2499448)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 26 noiembrie 2019 09:20:30
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
const int MAXN = 100001;

int arr[MAXN], n, t;

struct Node {
    int sum, pre, suf, sol;
}tree[4 * MAXN];

void createTree(int left, int right, int ind) {
    if (left == right) {
        tree[ind].sol = tree[ind].sum = tree[ind].pre = tree[ind].suf = arr[left];
        return;
    }
    int mid = left + (right - left) / 2;
    createTree(left, mid, 2 * ind);
    createTree(mid + 1, right, 2 * ind + 1);
    tree[ind].sum = tree[2 * ind].sum + tree[2 * ind + 1].sum;
    tree[ind].pre = max(tree[2 * ind].pre, tree[2 * ind].sum + tree[2 * ind + 1].pre);
    tree[ind].suf = max(tree[2 * ind + 1].suf, tree[2 * ind + 1].sum + tree[2 * ind].suf);
    tree[ind].sol = max(tree[2 * ind].sol, tree[2 * ind + 1].sol);
    tree[ind].sol = max(tree[ind].sol, tree[2 * ind].suf + tree[2 * ind + 1].pre);
}

Node findMax(int x, int y, int left, int right, int ind) {
    if (left >= x && right <= y)
        return tree[ind];
    int mid = left + (right - left) / 2;
    if (y <= mid)
        return findMax(x, y, left, mid, 2 * ind);
    if (x > mid)
        return findMax(x, y, mid + 1, right, 2 * ind + 1);
    Node leftRes = findMax(x, y, left, mid, 2 * ind), rightRes = findMax(x, y, mid + 1, right, 2 * ind + 1), res;
    res.sum = leftRes.sum + rightRes.sum;
    res.pre = max(leftRes.pre, leftRes.sum + rightRes.pre);
    res.suf = max(rightRes.suf, rightRes.sum + leftRes.suf);
    res.sol = max(leftRes.sol, rightRes.sol);
    res.sol = max(res.sol, leftRes.suf + rightRes.suf);
    return res;
}

int main() {
    fin >> n >> t;
    for (int i = 1; i <= n; ++i)
        fin >> arr[i];
    createTree(1, n, 1);
    for (int i = 0; i < t; ++i) {
        int x, y;
        Node sol;
        fin >> x >> y;
        sol = findMax(x, y, 1, n, 1);
        fout << sol.sol << '\n';
    }
    return 0;
}