Cod sursa(job #3161898)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 28 octombrie 2023 10:16:58
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>

using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int n,m,v[100001],x,y,suma,smaxst,smaxdr,ssm,nr;
struct nod
{
    int ssm,smaxst,smaxdr,suma;
}a[400001];
struct numar
{
    int nod,st, dr;
}b[100001];
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        a[nod]={v[st],v[st],v[st],v[st]};

    }
    else
    {

        int mid=(st+dr)/2;
        build(nod*2,st,mid);
        build(nod*2+1,mid+1,dr);
        a[nod].ssm=max(a[2*nod].ssm,a[2*nod+1].ssm);
        a[nod].ssm=max(a[nod].ssm,a[2*nod].smaxdr+a[2*nod+1].smaxst);
        a[nod].smaxst=max(a[2*nod].smaxst,a[2*nod].suma+a[2*nod+1].smaxst);
        a[nod].smaxdr=max(a[2*nod].smaxdr,a[2*nod].smaxdr+a[2*nod+1].suma);
        a[nod].suma=a[nod*2].suma+a[nod*2+1].suma;
    }
}
void caut(int nod,int st,int dr,int ac,int bc)
{
    if(ac<=st && dr<=bc)
    {

        b[++nr]={nod,st,dr};
    }
    else
    {
        int mid=(st+dr)/2;
        if(ac<=mid)
        {
            caut(nod*2,st,mid,ac,bc);

        }
        if(bc>mid)
            caut(nod*2+1,mid+1,dr,ac,bc);
    }
}
void prel()
{
    for(int i=1;i<=nr;i++)
    {
        int nod=b[i].nod;
        int st=b[i].st;
        int dr=b[i].dr;
        int noda=b[i-1].nod;
        int nodu=b[i+1].nod;
        smaxst=max(smaxdr,smaxst+a[nod].suma);
        suma=suma+a[nod].suma;
        ssm=max(ssm,a[nod].ssm);

        ssm=max(a[nod].ssm,smaxdr+a[noda].smaxst);

    }
}
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>>x>>y;
        nr=0;
        suma=0,smaxst=-100001,smaxdr=-100001,ssm=-100001;
        caut(1,1,n,x,y);
        prel();
        fout<<ssm<<"\n";

    }

    return 0;
}