Cod sursa(job #1836512)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 28 decembrie 2016 14:13:27
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <cstdio>
#define Nmax 100001
using namespace std;


ofstream g("sequencequery.out");

int T=1,m,n,x,y;

struct ARB{
    int smaxS,smaxD,smax,stot;
}arb[Nmax*3+4];

void Up(int nod)
{
    arb[nod].smax = max(max(arb[nod*2].smax,arb[nod*2+1].smax),arb[nod*2].smaxD+arb[nod*2+1].smaxS);
    arb[nod].smaxD = max(arb[nod*2+1].stot+arb[nod*2].smaxD,arb[nod*2+1].smaxD);
    arb[nod].smaxS = max(arb[nod*2].stot+arb[nod*2+1].smaxS,arb[nod*2].smaxS);
    arb[nod].stot = arb[nod*2].stot+arb[nod*2+1].stot;
    if (nod!=1)
        Up(nod/2);
}

ARB query(int nod, int a, int b, int st, int dr)
{
    if(st<=a && b<=dr)
        return arb[nod];
    int mid = (a+b)/2;
    if (dr<=mid)
        return query(nod*2,a,mid,st,dr);
    else if (st>mid)
        return query(nod*2+1,mid+1,b,st,dr);
    else if (st<=mid && dr>=mid)
    {
        ARB A = query(nod*2,a,mid,st,dr);
        ARB B = query(nod*2+1,mid+1,b,st,dr);
        ARB aux;
        aux.smax = max(max(A.smax,B.smax),A.smaxD+B.smaxS);
        aux.smaxD = max(B.stot+A.smaxD,B.smaxD);
        aux.smaxS = max(A.stot+B.smaxS,A.smaxS);
        aux.stot = A.stot+B.stot;
        return aux;
    }

}


void Up2(int nod)
{
    if (nod*2<=T)
    {
        Up2(nod*2+1);
        Up2(nod*2);
    }
    arb[nod].smax = max(max(arb[nod*2].smax,arb[nod*2+1].smax),arb[nod*2].smaxD+arb[nod*2+1].smaxS);
    arb[nod].smaxD = max(arb[nod*2+1].stot+arb[nod*2].smaxD,arb[nod*2+1].smaxD);
    arb[nod].smaxS = max(arb[nod*2].stot+arb[nod*2+1].smaxS,arb[nod*2].smaxS);
    arb[nod].stot = arb[nod*2].stot+arb[nod*2+1].stot;
}


int main()
{
    freopen("sequencequery.in","r",stdin);

    scanf("%ld%ld",&n,&m);

    int sav=n;
    while (sav!=0)
    {
        sav/=2;
        T*=2;
    }

    T--;
    for (int i=1;i<=n;i++)
    {
        scanf("%ld",&x);
        arb[T+i].stot = x;
        arb[T+i].smaxD = x;
        arb[T+i].smaxS = x;
        arb[T+i].smax = x;
    }
    Up2(1);


    for (int i=1;i<=m;i++)
    {
        scanf("%ld%ld",&x,&y);
        g<<query(1,1,T+1,x,y).smax<<'\n';
    }


    return 0;
}