Cod sursa(job #2579392)

Utilizator mihaimodiMihai Modi mihaimodi Data 12 martie 2020 13:43:55
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
#define inf 2000000000
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int s[300000],st[300000],dr[300000],smax[300000],v[100001];
int n,m,a,b,sol,sum;
void build(int nod, int x, int y)
{
    if(x==y)
    {
        s[nod]=st[nod]=dr[nod]=smax[nod]=v[x];
        return;
    }
    int mid=(x+y)/2;
    build(2*nod,x,mid);
    build(2*nod+1,mid+1,y);
    s[nod]=s[2*nod]+s[2*nod+1];///suma totala
    st[nod]=max(st[2*nod],s[2*nod]+st[2*nod+1]);///suma la stanga
    dr[nod]=max(dr[2*nod+1],s[2*nod+1]+dr[2*nod]);///suma la dreapta
    smax[nod]=max(smax[2*nod],smax[2*nod+1]);///suma maxima
    smax[nod]=max(smax[nod],st[2*nod+1]+dr[2*nod]);
}

void query(int nod, int x, int y)
{
    if(a<=x&&y<=b)
    {
        sol=max(sol,max(smax[nod],sum+st[nod]));
        sum=max(sum+s[nod],dr[nod]);///partea dreapta
        return;
    }
    int mid=(x+y)/2;
    if(a<=mid)
        query(2*nod,x,mid);
    if(b>mid)
        query(2*nod+1,mid+1,y);
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        fin>>a>>b;
        sol=-inf,sum=-inf;
        query(1,1,n);
        fout<<sol<<' ';
    }
    return 0;
}