Cod sursa(job #2777894)

Utilizator NeuerRaducu Ioan Stefan Neuer Data 25 septembrie 2021 19:14:21
Problema SequenceQuery Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream in("sequencequery.in");
ofstream out("sequencequery.out");
const int SIZE = 1e5+10, INF = 10e7;

struct inter
{
    int sum, maxl, maxr, maxim;
};

int n, m, a, b;
inter arb[SIZE*4];

inter combine(inter st, inter dr)
{
    inter rez;
    rez.sum = st.sum + dr.sum;

    rez.maxl = st.maxl;
    rez.maxl = max(rez.maxl, st.sum + dr.maxl);
    rez.maxl = max(rez.maxl, st.sum);

    rez.maxr = dr.maxr;
    rez.maxr = max(rez.maxr, dr.sum + st.maxr);
    rez.maxr = max(rez.maxr, dr.sum);

    rez.maxim = max(st.maxim, dr.maxim);
    rez.maxim = max(rez.maxim, rez.maxl);
    rez.maxim = max(rez.maxim, rez.maxr);
    rez.maxim = max(rez.maxim, st.maxr + dr.maxl);
    rez.maxim = max(rez.maxim, dr.maxl);
    rez.maxim = max(rez.maxim, st.maxr);

    return rez;

}

void formArb(int ind, int st, int dr)
{
    if(st==dr)
    {
        in>>arb[ind].sum;
        arb[ind].maxim = arb[ind].maxl = arb[ind].maxr = arb[ind].sum;
        return;
    }
    int mid = (st + dr) / 2;
    formArb(ind*2, st, mid), formArb(ind*2+1, mid+1, dr);
    arb[ind] = combine(arb[ind*2], arb[ind*2+1]);
}

void coutArb(int ind, int st, int dr)
{
    cout<<ind<<": "<<st<<' '<<dr<<": ";
    cout<<arb[ind].sum<<' '<<arb[ind].maxim<<", "<<arb[ind].maxl<<" "<<arb[ind].maxr<<"\n";
    if(st>=dr) return;
    int mid = (st + dr) / 2;
    coutArb(ind*2, st, mid), coutArb(ind*2+1, mid+1, dr);
}

inter query(int ind, int st, int dr)
{
    if(a <= st && dr <= b) return arb[ind];
    int mid = (st + dr) / 2;
    inter rez1, rez2;
    rez1 = rez2 = {INF, INF, INF, INF};
    if(a<=mid) rez1 = query(ind*2, st, mid);
    if(mid<b) rez2 = query(ind*2+1, mid+1, dr);
    if(rez1.maxim == INF) return rez2;
    if(rez2.maxim == INF) return rez1;
    return combine(rez1, rez2);
}

void readit()
{
    in>>n>>m;
    formArb(1, 1, n);
}

int main()
{
    readit();
    for(int i=1; i<=m; i++)
    {
        in>>a>>b;
        out<<query(1, 1, n).maxim<<'\n';
    }
    return 0;
}