Cod sursa(job #3252425)

Utilizator laura2020Moldovan Laura laura2020 Data 29 octombrie 2024 16:10:26
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
#define ll long long
vector<ll> v;
struct Aint
{
    ll ssm,prefix,sufix,suma;
};
vector<Aint> aint;
Aint Update_Frunza(ll x)
{
    Aint aux;
    aux.ssm=aux.prefix=aux.sufix=aux.suma=x;
    return aux;
}
Aint Combine_Nod(Aint a,Aint b)
{
    Aint aux;
    ///ssm
        ///Avem 3 cazuri, yey
        aux.ssm=max(a.ssm,b.ssm); ///maximul este integral in una din jumatati
        aux.ssm=max(aux.ssm,a.sufix+b.prefix); ///maximul este splituit in ambele jumatati
    ///prefix
        aux.prefix=max(a.prefix,a.suma+b.prefix);
    ///sufix
        aux.sufix=max(b.sufix,a.sufix+b.suma);
    ///suma
        aux.suma=a.suma+b.suma;
    return aux;
}
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        aint[nod]=Update_Frunza(v[st]);
        return ;
    }
    int mid=(st+dr)/2;
    build(2*nod,st,mid);
    build(2*nod+1,mid+1,dr);
    aint[nod]=Combine_Nod(aint[2*nod],aint[2*nod+1]);
}

Aint query(int nod,int st,int dr,int q_st,int q_dr)
{
    //cout<<st<<" "<<dr<<" "<<q_st<<" "<<q_dr<<" "<<aint[nod].ssm<<'\n';
    if(q_st<=st && dr<=q_dr)
    {
        return aint[nod];
    }
    bool sem=0;
    int mid=(st+dr)/2;
    Aint aux;
    if(q_st<=mid)
    {
        aux=query(2*nod,st,mid,q_st,q_dr);
        sem=1;
    }
    if(mid<q_dr)
    {
        if(sem==1)
            aux=Combine_Nod(aux,query(2*nod+1,mid+1,dr,q_st,q_dr));
        else
            aux=query(2*nod+1,mid+1,dr,q_st,q_dr);
    }
    return aux;
}

int main()
{
    Aint aux;
    int n,m,i,a,b;
    fin>>n>>m;
    aint.resize(4*n);
    v.resize(n+1);
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        fin>>a>>b;
        aux=query(1,1,n,a,b);
        fout<<aux.ssm<<'\n';
    }
    return 0;
}