Cod sursa(job #3138665)

Utilizator AnonymousUserBogdan Ionelia AnonymousUser Data 21 iunie 2023 08:16:37
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <iostream>
#include <fstream>

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

const int N = 100000;
long long arr[N+1];

struct tree_node{
    long long sum;
    long long smax;
    long long pref_smax;
    long long suff_smax;
}segment_tree[4*N+1];

tree_node update_node(tree_node left, tree_node right)
{
    tree_node current_node;
    current_node.sum = left.sum + right.sum;
    current_node.pref_smax = max(right.pref_smax, right.sum + left.pref_smax);
    current_node.suff_smax = max(left.suff_smax, left.sum + right.suff_smax);
    current_node.smax = max(left.pref_smax+right.suff_smax, (left.smax, right.smax));
    return current_node;
}

void build(int node, int left, int right)
{
    if(left == right)
        segment_tree[node].sum = segment_tree[node].smax = segment_tree[node].pref_smax = segment_tree[node].suff_smax = arr[left];
    else
    {
        int m = (left + right) / 2;
        build(node*2, left, m);
        build(node*2+1, m+1, right);
        segment_tree[node] = update_node(segment_tree[node*2], segment_tree[node*2+1]);
    }
}

tree_node query(int node, int left, int right, int q_left, int q_right)
{
    if(q_left <= left && right <= q_right)
        return segment_tree[node];
    else
    {
        int m = (left + right) / 2;
        if(q_right <= m)
            return query(node*2, left, m, q_left, q_right);
        if(m + 1 <= q_left)
            return query(node*2+1, m+1, right, q_left, q_right);
        return update_node(query(node*2, left, m, q_left, q_right), query(node*2+1, m+1, right, q_left, q_right));
    }
}

int main()
{
    int n, m, x, y;
    fin >> n >> m;
    for(int i = 1; i <= n; ++i)
        fin >> arr[i];
    build(1, 1, n);
    while(m--)
    {
        fin >> x >> y;
        fout << query(1, 1, n, x, y).smax << '\n';
    }
    return 0;
}