Cod sursa(job #2442187)

Utilizator StorakNo Name Storak Data 23 iulie 2019 10:31:16
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("sequencequery.in");
ofstream out("sequencequery.out");
const int N = 1e5+5;
struct a
{
    long long sum,best,left,right;
} tree[4*N];
void update(int node, int st, int dr, int poz, int val)
{
    if (st == dr)
        tree[node].best = tree[node].left = tree[node].right = tree[node].sum = val;
    else
    {
        int mj = (st+dr)/2;
        if (poz<=mj)
            update(2*node,st,mj,poz,val);
        else
            update(2*node+1,mj+1,dr,poz,val);

        tree[node].left = max(tree[2*node].sum+tree[2*node+1].left,tree[2*node].left);
        tree[node].right = max(tree[2*node+1].sum+tree[2*node].right,tree[2*node+1].right);
        tree[node].sum = tree[2*node].sum+tree[2*node+1].sum;
        tree[node].best = max(tree[2*node].right+tree[2*node+1].left,max(tree[2*node].best,tree[2*node+1].best));
    }
}
a query(int node, int st, int dr, int x, int y)
{
    if (x<=st && dr<=y)
        return tree[node];
    else
    {
        int mj = (st+dr)/2;
        if (x<=mj && y<=mj)
            return query(2*node,st,mj,x,y);
        if (x>mj && y>mj)
            return query(2*node+1,mj+1,dr,x,y);
        if (x<=mj && y>mj)
        {
            a L = query(2*node,st,mj,x,y);
            a R = query(2*node+1,mj+1,dr,x,y);
            a now;
            now.left = max(L.sum+R.left,L.left);
            now.right = max(R.sum+L.right,R.right);
            now.sum = L.sum+R.sum;
            now.best = max(L.right+R.left,max(L.best,R.best));
            return now;
        }
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m;
    in >> n >> m;
    for (int i = 1; i<=n; i++)
    {
        long long x;
        in >> x;
        update(1,1,n,i,x);
    }
    for (int i = 1; i<=m; i++)
    {
        int x,y;
        in >> x >> y;
        out << query(1,1,n,x,y).best << "\n";
    }
}