Cod sursa(job #1964956)

Utilizator alex99Chelba Alexandru alex99 Data 13 aprilie 2017 20:43:42
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
struct interval
{
    int  stn,drt;
    long long sumstn, sumdrt, summij, sumtot;
};
interval arb[300001];
int n,q,nr,x,y;
long long sol,aux;
char c;
void update(int po, int st, int dr, int p, int val)
{
    if(st>=p&&p>=dr)
    {
        arb[po].stn=st;
        arb[po].drt=dr;
        arb[po].sumstn=val;
        arb[po].sumdrt=val;
        arb[po].summij=val;
        arb[po].sumtot=val;
        return ;
    }
    arb[po].stn=st;
    arb[po].drt=dr;
    int mij=(st+dr)/2;
    if(p<=mij) update(2*po,st,mij,p,val);
    else update(2*po+1,mij+1,dr,p,val);
    arb[po].sumtot=arb[2*po].sumtot+arb[2*po+1].sumtot;
    arb[po].sumstn=max(arb[2*po].sumstn,arb[2*po].sumtot+arb[2*po+1].sumstn);
    arb[po].sumdrt=max(arb[2*po+1].sumdrt,arb[2*po].sumdrt+arb[2*po+1].sumtot);
    arb[po].summij=max(max(arb[2*po].summij,arb[2*po+1].summij),arb[2*po].sumdrt+arb[2*po+1].sumstn);
}
void interogare(int po, int st, int dr, int a, int b)
{
    if(a<=st&&dr<=b)
    {
        sol=max(sol,max(arb[po].summij,aux+arb[po].sumstn));
        aux=max(aux+arb[po].sumtot, arb[po].sumdrt);
        return;
    }
    int mij=(st+dr)/2;
    if(a<=mij) interogare(2*po,st,mij,a,b);
    if(b>mij) interogare(2*po+1,mij+1,dr,a,b);
}
int main()
{
    f>>n>>q;
    for(int i=1;i<=n;i++)
    {
        f>>nr;
        update(1,1,n,i,nr);
    }
    for(int i=1;i<=q;i++)
    {
        f>>x>>y;
        sol=aux=-inf;
        interogare(1,1,n,x,y);
        g<<sol<<'\n';
    }
    return 0;
}