Cod sursa(job #1289323)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 9 decembrie 2014 19:47:29
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#define DIM 100011
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
int n,m;
int a[DIM];

struct arbore{
    long long smax,st,dr,sum;
};
arbore v[4*DIM+1];

void construct(int nod,int p,int u){
    if(p==u){
        v[nod].smax=v[nod].sum=v[nod].dr=v[nod].st=a[p];
        return;
    }
    int mid=p+(u-p)/2;
    construct(2*nod,p,mid);
    construct(2*nod+1,mid+1,u);
    v[nod].sum=v[2*nod].sum+v[2*nod+1].sum;
    v[nod].smax=max(v[2*nod+1].smax,v[2*nod].smax);
    v[nod].smax=max(v[nod].smax,v[2*nod].dr+v[2*nod+1].st);
    v[nod].st=max(v[2*nod].st,v[2*nod].sum+v[2*nod+1].st);
    v[nod].dr=max(v[2*nod+1].dr,v[2*nod+1].sum+v[2*nod].dr);
}

arbore query(int nod,int p,int u,int A,int B){
    arbore r1,r2,r;
    r1.st=r2.st=r.st=0;
    r1.dr=r2.dr=r.dr=0;
    r.smax=r1.smax=r2.smax=0;
    r.sum=r1.sum=r2.sum=0;
    int st=-1,dr=-1;
    if(A<=p && u<=B)
        return v[nod];
    int mid=p+(u-p)/2;
    if(A<=mid)
        r1=query(2*nod,p,mid,A,B),st=1;
    if(B>mid)
        r2=query(2*nod+1,mid+1,u,A,B),dr=1;
    if(st==dr==1){
        r.sum=r1.sum+r2.sum;
        r.st=max(r1.st,r1.sum+r2.st);
        r.dr=max(r2.dr,r2.sum+r1.dr);
        r.smax=max(r1.dr+r2.st,r1.smax);
        r.smax=max(r.smax,r2.smax);
        return r;
    }
    if(st==1)
        return r1;
    if(dr==1)
        return r2;

}

int main(void){
    register int i,j,A,B;
    arbore r;

    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>a[i];
    a[0]=0;
    construct(1,1,n);
    for(i=1;i<=m;i++){
        f>>A>>B;
        r=query(1,1,n,A,B);
        g<<r.smax<<"\n";
    }
    f.close();
    g.close();
    return 0;
}