Cod sursa(job #3254391)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 7 noiembrie 2024 14:38:09
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<bits/stdc++.h>

using namespace std;

const int NMAX = 1e5 + 5;
const long long INF = 1e18 + 7;
int n, q, v[NMAX];

struct arb
{
    long long ssm, st, dr, sum;
} arbint[4 * NMAX];

arb merge(arb a, arb b)
{
    arb c = {-INF, -INF, -INF, -INF};
    c.sum = a.sum + b.sum;
    c.st = max(a.st, a.sum + b.st);
    c.dr = max(b.dr, a.dr + b.sum);
    c.ssm = max(a.ssm, max(b.ssm, a.dr + b.st));

    return c;
}

void update(int poz, int val, int arbst, int arbdr, int idx)
{
    if(arbst == arbdr)
    {
        arbint[idx] = {val, val, val, val};
        return;
    }

    int mij = (arbst + arbdr) / 2;
    if(poz <= mij)
        update(poz, val, arbst, mij, idx * 2);
    else
        update(poz, val, mij + 1, arbdr, idx * 2 + 1);
    
    arbint[idx] = merge(arbint[idx * 2], arbint[idx * 2 + 1]);
}

arb sol;

void query(int l, int d, int arbst, int arbdr, int idx)
{
    if(arbst > d || arbdr < l)
        return;
    if(arbst >= l && arbdr <= d)
    {
        sol = merge(sol, arbint[idx]);
        return;
    }
    
    int mij = (arbst + arbdr) / 2;
    query(l, d, arbst, mij, idx * 2); 
    query(l, d, mij + 1, arbdr, idx * 2 + 1);
    return;
}

int main()
{
    freopen("sequencequery.in", "r", stdin);
    freopen("sequencequery.out", "w", stdout);
    cin >> n >> q;
    for(int i = 1; i <= 4 * n; i++)
        arbint[i] = {-INF, -INF, -INF, -INF};
    for(int i = 1; i <= n; i++)
    {
        cin >> v[i];
        update(i, v[i], 1, n, 1);
    }
    int a, b;
    for(int i = 1; i <= q; i++)
    {
        sol = {-INF, -INF, -INF, -INF};
        cin >> a >> b;
        query(a, b, 1, n, 1);
        cout << sol.ssm << "\n";
    }
}