Cod sursa(job #2155828)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 8 martie 2018 10:24:56
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
# include <fstream>
# define DIM 100010
# define INF 10000000000LL
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
struct arbore{
    long long s,st,dr,val;
}arb[4*DIM];
int v[DIM],n,q,i,p,u;
long long drmax,maxim;
void build(int nod,int st,int dr){
    if(st==dr){
        arb[nod].val=arb[nod].st=arb[nod].dr=arb[nod].s=v[st];
        return;
    }
    int mij=(st+dr)/2;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    arb[nod].s=arb[2*nod].s+arb[2*nod+1].s;
    arb[nod].st=max(arb[2*nod].s+arb[2*nod+1].st,arb[2*nod].st);
    arb[nod].dr=max(arb[2*nod+1].s+arb[2*nod].dr,arb[2*nod+1].dr);
    arb[nod].val=max(arb[2*nod].val,arb[2*nod+1].val);
    arb[nod].val=max(arb[nod].val,arb[2*nod].dr+arb[2*nod+1].st);
}
void query(int nod,int st,int dr,int p,int u){
    if(p<=st&&u>=dr){
        maxim=max(maxim,arb[nod].val);
        maxim=max(maxim,drmax+arb[nod].st);
        drmax=max(drmax+arb[nod].s,arb[nod].dr);
        return;
    }
    if(st>=dr)
        return;
    int mij=(st+dr)/2;
    if(p<=mij)
        query(2*nod,st,mij,p,u);
    if(u>mij)
        query(2*nod+1,mij+1,dr,p,u);
}
int main () {
    fin>>n>>q;
    for(i=1;i<=n;i++)
        fin>>v[i];
    build(1,1,n);
    for(i=1;i<=q;i++){
        fin>>p>>u;
        maxim=-INF;
        drmax=-INF;
        if(p>u)
            swap(p,u);
        query(1,1,n,p,u);
        fout<<maxim<<"\n";
    }
    return 0;
}