Cod sursa(job #2878933)

Utilizator Alle43221Moroz Alexandra-Ioana Alle43221 Data 28 martie 2022 10:26:17
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>

#define max_n 100002

using namespace std;

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

int v[max_n], n, m, a, b, mare=-max_n;

struct nod
{
    long long s;
    long long ssec;
    long long first, last;
} A[4*max_n];

void update (int n, int a, int b)
{
    A[n].s=A[a].s+A[b].s;
    A[n].first=max(A[a].first, A[b].first+A[a].s);
    A[n].last=max(A[b].last, A[a].last+A[b].s);
    A[n].ssec=max(A[a].last+A[b].first, max(A[a].ssec, A[b].ssec));
}

void build(int l, int r, int n)
{
    if(r==l)
    {
        A[n].s=v[l];
        A[n].ssec=v[l];
        A[n].first=v[l];
        A[n].last=v[l];
    }
    else
    {
        int m=(l+r)/2;
        build(l, m, 2*n);
        build(m+1, r, 2*n+1);
        update(n, 2*n, 2*n+1);
    }
}

void maximul(int l, int r, int n, int a, int b)
{
    if((a<=l)&&(r<=b))
    {
        if(A[n].ssec>mare)
        {
            mare=A[n].ssec;
        }
    }
    else
    {
        int m=(l+r)/2;
        if(m>=a)
        {
            maximul(l, m, 2*n, a, b);
        }
        if(m+1<=b)
        {
            maximul(m+1, r, 2*n+1, a, b);
        }
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fin>>v[i];
    }
    build(1, n, 1);

    for(int i=0; i<m; i++)
    {
        fin>>a>>b;
        mare=-max_n;
        maximul(1, n, 1, a, b);
        fout<<mare<<'\n';
    }

    /*
    for(int i=1; i<=4*n; i++)
    {
        fout<<A[i].ssec<<' ';
    }
    */


    fin.close();
    fout.close();
    return 0;
}