Cod sursa(job #3374973)

Utilizator IzabelaJePloscaru Maria Izabela IzabelaJe Data 9 noiembrie 2026 21:21:33
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <algorithm>
#define DIM 100005
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
const long long INF=(1LL<<30);
int N,M;
int v[DIM];
struct nodAINT{
    long long sum;
    long long submax;
    long long sufmax;
    long long prefmax;
};
nodAINT A[4*DIM];
nodAINT update(nodAINT st,nodAINT dr){
    nodAINT sol;
    sol.sum=st.sum+dr.sum;
    sol.submax=max( max(st.submax,dr.submax) ,st.sufmax+dr.prefmax  );
    sol.prefmax=max( st.prefmax, st.sum+dr.prefmax  );
    sol.sufmax=max( dr.sufmax, dr.sum+st.sufmax );
    return sol;

}
void build(int nod,int st,int dr){
    if(st==dr){
        A[nod].sum=v[st];
        A[nod].submax=v[st];
        A[nod].sufmax=v[st];
        A[nod].prefmax=v[st];
    }
    else{
        int mid=(st+dr)/2;
        build(2*nod,st,mid);
        build(2*nod+1,mid+1,dr);
        A[nod]=update(A[2*nod],A[2*nod+1]);
    }
}
void query(int nod,int st,int dr,int a,int b,nodAINT &maxim){
    if(a<=st && dr<=b){
        if(maxim.sum==-INF)
            maxim=A[nod];
        else
            maxim=update(maxim,A[nod]);
    }
    else{
        int mid=(st+dr)/2;
        if(a<=mid)
            query(2*nod,st,mid,a,b,maxim);
        if(b>mid)
            query(2*nod+1,mid+1,dr,a,b,maxim);
    }
}
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++){
        int a,b;
        fin>>a>>b;
        nodAINT maxim={-INF,-INF,-INF,-INF};
        query(1,1,N,a,b,maxim);
        fout<<maxim.submax<<"\n";
    }
    return 0;
}