Cod sursa(job #2630407)

Utilizator ElektrykT E S L A P E F E L I E Elektryk Data 25 iunie 2020 16:33:27
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <fstream>

using namespace std;

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

void update ( long long nod, long long left, long long right, long long poz, long long val);

void f_find ( long long nod, long long left, long long right );

struct ura
{
    long long smax;
    long long s;
    long long sl;
    long long sr;
} aint[500137];

long long n, m;

long long x, y;

long long sorin;

long long aux;

int main()
{
    in >> n >> m;
    for ( register long long i = 1 ; i <= n ; ++i )
    {
        in >> x;
        update ( 1, 1, n, i, x );
    }
    for ( register long long j = 1 ; j <= m ; ++j )
    {
        in >> x >> y;
        sorin = -1e9;
        aux = 0;
        f_find ( 1, 1, n );
        out << sorin << '\n';
    }
    return 0;
}

void update ( long long nod, long long left, long long right, long long poz, long long val)
{
    long long mid = ( left + right ) / 2;
    if ( left == right )
    {
        aint[nod] = { val, val, val, val };
        return ;
    }
    if ( poz <= mid )
        update ( nod * 2, left, mid, poz, val );
    else
        update ( nod * 2 + 1, mid + 1, right, poz, val );
    aint[nod].s = aint[nod * 2].s + aint[nod * 2 + 1].s;
    aint[nod].smax = max ( aint[nod * 2].sr + aint[nod * 2 + 1].sl, max ( aint[nod * 2].smax, aint[nod * 2 + 1].smax ) );
    aint[nod].sl = max ( aint[nod * 2].sl, aint[nod * 2].s + aint[nod * 2 + 1].sl );
    aint[nod].sr = max ( aint[nod * 2 + 1].sr, aint[nod * 2 + 1].s + aint[nod * 2].sr );
}

void f_find ( long long nod, long long left, long long right )
{
    long long mid = ( left + right ) / 2;
    if ( x <= left && right <= y )
    {
        sorin = max ( sorin, max ( aint[nod].smax, aux + aint[nod].sl ) );
        aux = max ( aux + aint[nod].s, aint[nod].sr );
        return ;
    }
    if ( x <= mid )
        f_find ( nod * 2, left, mid );
    if ( mid < y )
        f_find ( nod * 2 + 1, mid + 1, right );
}