Cod sursa(job #1249189)

Utilizator ThomasFMI Suditu Thomas Thomas Data 26 octombrie 2014 17:30:07
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <algorithm>
using namespace std;

#define NMax 100005
#define AMax 400005
#define inf 2100000000
#define fiu1 (nod<<1)
#define fiu2 ((nod<<1)|1)
#define mij ((st+dr)>>1)

ifstream f("sequencequery.in");
ofstream g("sequencequery.out");

int n,m;
int v[NMax];

struct arb{long long st,dr,best,sum;} A[AMax];

arb merged(arb f1,arb f2)
{
    if(f1.best==-inf) return f2;
    if(f2.best==-inf) return f1;

    arb T;
    T.sum=f1.sum+f2.sum;
    T.best=max( f1.dr+f2.st , max(f1.best , f2.best) );
    T.st=max( f1.st , f1.sum+f2.st );
    T.dr=max( f2.dr , f2.sum+f1.dr );
    return T;
}

void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        A[nod].st=A[nod].dr=A[nod].best=A[nod].sum=v[st];
    }
    else
    {
        build(fiu1,st,mij);
        build(fiu2,mij+1,dr);
        A[nod]=merged(A[fiu1],A[fiu2]);
    }
}

arb query(int nod,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        return A[nod];
    }
    else if(st!=dr)
    {
        arb q1,q2;
        q1.best=q2.best=-inf;
        if(a<=mij) q1=query(fiu1,st,mij,a,b);
        if(b>mij) q2=query(fiu2,mij+1,dr,a,b);
        return merged(q1,q2);
    }
}

int main()
{
    int i,a,b;
    arb sol;

    f>>n>>m;
    for(i=1;i<=n;++i) f>>v[i];

    build(1,1,n);

    for(i=1;i<=m;++i)
    {
        f>>a>>b;
        sol=query(1,1,n,a,b);
        g<<sol.best<<"\n";
    }

    f.close();
    g.close();
    return 0;
}