Cod sursa(job #2972896)

Utilizator matei8787Matei Dobrea matei8787 Data 30 ianuarie 2023 16:37:55
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("sequencequery.in");
ofstream out("sequencequery.out");
const int N = 1e5;
const int INF = 1e9;
struct Nod
{
    long long prefix, sufix, smax, suma; ///smax = suma secventei de suma maxima, suma = suma intregii secvente
};
Nod aint[N * 4];
int fs(int nod) { return nod * 2; }
int fd(int nod) { return nod * 2 + 1; }
Nod make_nod(Nod nod_st, Nod nod_dr)
{
    Nod aux;
    aux.suma = nod_st.suma + nod_dr.suma;
    aux.prefix = max(nod_st.prefix, nod_st.suma + nod_dr.prefix );
    aux.sufix = max(nod_dr.sufix, nod_st.sufix + nod_dr.suma );
    aux.smax = max(nod_dr.smax, max(nod_st.smax, nod_st.sufix + nod_dr.prefix));
    return aux;
}
void build(int nod, int st, int dr, int idx, long long nr)
{
    if ( st == dr )
    {
        aint[nod] = {nr, nr, nr, nr};
        return;
    }
    int mij = ( st + dr ) / 2;
    if ( idx <= mij )
    {
        build(fs(nod), st, mij, idx, nr);
    }
    else
    {
        build(fd(nod), mij + 1, dr, idx, nr);
    }
    aint[nod] = make_nod(aint[fs(nod)], aint[fd(nod)]);
}
Nod query(int nod, int st, int dr, int qs, int qd)
{
    if ( st > qd || dr < qs )
    {
        Nod aux = {-INF, -INF, -INF, -INF};
        return aux;
    }
    if ( qs <= st && dr <= qd )
    {
        return aint[nod];
    }
    int mij = ( st + dr ) / 2;
    return make_nod(query(fs(nod), st, mij, qs, qd), query(fd(nod), mij + 1, dr, qs, qd));
}
int n, m;
void citire()
{
    in>>n>>m;
    for ( int i = 1 ; i <= n ; i++ )
    {
        long long x;
        in>>x;
        build(1, 1, n, i, x);
    }
}
void rez()
{
    for ( int i = 1 ; i <= m ; i++ )
    {
        int x, y;
        in>>x>>y;
        out<<query(1, 1, n, x, y).smax<<'\n';
    }
}
int main()
{
    citire();
    rez();
    return 0;
}