Cod sursa(job #2526304)

Utilizator dimi999Dimitriu Andrei dimi999 Data 18 ianuarie 2020 14:33:47
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Node
{
    long long left, right, s, ans;
};

struct Aint
{
    Node v[400005];

    Node Merge(Node first, Node second)
    {
        Node ans;

        ans.s = first.s + second.s;
        ans.left = max(first.left, first.s + second.left);
        ans.right = max(second.right, second.s + first.right);
        ans.ans = max(first.right + second.left, max(first.ans, second.ans));
        return ans;
    }


    void update(int node, int st, int dr, int pos, int val)
    {
        if(st == dr)
        {
            v[node].left = v[node].right = v[node].ans = v[node].s = val;
            return;
        }

        int mij = (st + dr) / 2;

        if(pos <= mij)
            update(2*node, st, mij, pos, val);
        else
            update(2*node + 1, mij + 1, dr, pos, val);

        v[node] = Merge(v[2*node], v[2*node + 1]);
    }

    Node query(int node, int st, int dr, int l, int r)
    {
        if(st == l && dr == r)
            return v[node];

        int mij = (st + dr) / 2;

        if(r <= mij)
            return query(2*node, st, mij, l, r);
        else
            if(l >= mij + 1)
            return query(2*node + 1, mij + 1, dr, l, r);
        else
            return Merge(query(2*node, st, mij, l, mij),query(2*node + 1, mij + 1, dr, mij + 1, r));
    }
}aint;

int main()
{
    int n, m;

    fin >> n >> m;

    for(int i = 1; i <= n ; i++)
    {
        int x;
        fin >> x;

        aint.update(1, 1, n, i, x);
    }

    for(int i = 1; i <= m ; i++)
    {
        int x, y;
        fin >> x >> y;

        fout << aint.query(1, 1, n, x, y).ans << '\n';
    }

    return 0;
}