Cod sursa(job #3290546)

Utilizator bogdan1479Luca Bogdan Alexandru bogdan1479 Data 31 martie 2025 09:46:30
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>

using namespace std;

const int NMAX = 100001;

struct nodarb
{
    long long sst, sdr, sum, ssm;
    nodarb(long long val = 0)
    {
        sst = sdr = sum = ssm = val;
    }
};

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

nodarb ai[4 * NMAX];
int poz, x, y, val;
long long sec, sol;

void update(int rad, int st, int dr)
{
    if(st == dr) ai[rad] = nodarb(val);
    else
    {
        int mij = (st + dr) / 2;
        if(poz <= mij) update(2 * rad, st, mij);
        else update(2 * rad + 1, mij + 1, dr);
        ai[rad].sst = max(ai[2 * rad].sst, ai[2 * rad].sum + ai[2 * rad + 1].sst);
        ai[rad].sdr = max(ai[2 * rad + 1].sdr, ai[2 * rad + 1].sum + ai[2 * rad].sdr);
        ai[rad].sum = ai[rad * 2].sum + ai[rad * 2 + 1].sum;
        ai[rad].ssm = max(ai[2 * rad].ssm, max(ai[2 * rad + 1].ssm, ai[rad * 2].sdr + ai[2 * rad + 1].sst));
    }
}

void query(int rad, int st, int dr)
{
    if(x <= st && y >= dr)
    {
        if(sec < 0) sec = 0;
        sol = max(sol, max(sec + ai[rad].sst, ai[rad].ssm));
        sec = max(sec + ai[rad].sum, ai[rad].sdr);
    }
    else
    {
        int mij = (st + dr) / 2;
        if(x <= mij) query(2 * rad, st, mij);
        if(y > mij) query(2 * rad + 1, mij + 1, dr);
    }
}

int main()
{
    int n, m;
    fin >> n >> m;
    for(poz = 1; poz <= n; ++poz)
    {
        fin >> val;
        update(1, 1, n);
    }
    while(m--)
    {
        fin >> x >> y;
        sec = sol = 1LL << 63;
        query(1, 1, n);
        fout << sol << '\n';
    }
    return 0;
}