Cod sursa(job #2973277)

Utilizator rapidu36Victor Manz rapidu36 Data 31 ianuarie 2023 17:41:52
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>

using namespace std;

const int N = 1 << 18;
const long long INF = 1LL << 60;

struct secv
{
    long long prefix, sufix, ssm, total;
};

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

secv aint[N];

void combin(secv &rez, secv &x, secv &y)
{
    rez.total = x.total + y.total;
    rez.prefix = x.prefix;
    rez.prefix = max(rez.prefix, x.total + y.prefix);
    rez.sufix = y.sufix;
    rez.sufix = max(rez.sufix, x.sufix + y.total);
    rez.ssm = max(x.ssm, y.ssm);
    rez.ssm = max(rez.ssm, x.sufix + y.prefix);
}

void constructie(int p, int st, int dr)
{
    if (st == dr)
    {
        in >> aint[p].total;
        aint[p].prefix = aint[p].sufix = aint[p].ssm = aint[p].total;
        return;
    }
    int m = (st + dr) / 2, fs = 2 * p, fd = 2 * p + 1;
    constructie(fs, st, m);
    constructie(fd, m + 1, dr);
    combin(aint[p], aint[fs], aint[fd]);
}

void interogare(int p, int st, int dr, int a, int b, secv &rez)
{
    if (a <= st && dr <= b)
    {
        rez = aint[p];
        return;
    }
    int m = (st + dr) / 2, fs = 2 * p, fd = 2 * p + 1;
    secv rez_st, rez_dr;
    rez_st = rez_dr = (secv){-INF, -INF, -INF, 0};
    if (a <= m)
    {
        interogare(fs, st, m, a, b, rez_st);
    }
    if (m + 1 <= b)
    {
        interogare(fd, m + 1, dr, a, b, rez_dr);
    }
    combin(rez, rez_st, rez_dr);
}

int main()
{
    int n, nq;
    in >> n >> nq;
    constructie(1, 1, n);
    for (int i = 0; i < nq; i++)
    {
        int a, b;
        secv rez;
        in >> a >> b;
        interogare(1, 1, n, a, b, rez);
        out << rez.ssm << "\n";
    }
    in.close();
    out.close();
    return 0;
}