Cod sursa(job #3265777)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 3 ianuarie 2025 12:27:15
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
using namespace std;

ifstream cin("sequencequery.in");
ofstream cout("sequencequery.out");

#define int long long

struct nod{
    int st,dr,a,sum;
} aint[400001];
int v[100001];

nod combin(nod a,nod b){
    nod rasp;
    rasp.a=max(max(a.a,b.a),a.dr+b.st);
    rasp.st=max(a.sum+b.st,a.st);
    rasp.dr=max(b.dr,b.sum+a.dr);
    rasp.sum=a.sum+b.sum;
    return rasp;
}

void init(int nod,int st,int dr){
    if(st==dr){
        aint[nod].st=aint[nod].dr=aint[nod].a=aint[nod].sum=v[st];
        return ;
    }
    int mij=(st+dr)/2;
    init(2*nod,st,mij);
    init(2*nod+1,mij+1,dr);
    aint[nod]=combin(aint[2*nod],aint[2*nod+1]);
}

nod query(int nod,int st,int dr,int a,int b){
    if(b<st || dr<a) return {(int)-1e18,(int)-1e18,(int)-1e18,0};
    if(a<=st && dr<=b) return aint[nod];
    int mij=(st+dr)/2;
    return combin(query(2*nod,st,mij,a,b),
                  query(2*nod+1,mij+1,dr,a,b));

}

signed main()
{
    int n,m,i,a,b;
    cin>>n>>m;
    for(i=1;i<=n;i++){
        cin>>v[i];
    }
    init(1,1,n);
    for(i=1;i<=m;i++){
        cin>>a>>b;
        cout<<query(1,1,n,a,b).a<<"\n";
    }
    return 0;
}