Cod sursa(job #353355)

Utilizator irene_mFMI Irina Iancu irene_m Data 4 octombrie 2009 20:30:48
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <cstdio>
#define MaxN 100050
#define fs(x)     ((x)*2)
#define fd(x)     ((x)*2+1)
#define max(a, b) (a > b ? a : b)

struct xd{
      long long a,b,c,d;
};

xd Arb[4*MaxN];

int N,M,Val,Pos,A,B,i,V[MaxN];
long long Max,Sum;

using namespace std;

/*int Maxim(long long a,int b)
{
      if(a>b)
            return a;
      return b;
}*/

void Update(int nod,int st,int dr)
{
      if(st==dr && st==Pos)
      {
            Arb[nod].a=Arb[nod].b=Arb[nod].c=Arb[nod].d=Val;
            return;
      }
      int div=(st+dr)/2;
      if(div>=Pos)
            Update(fs(nod),st,div);
      else
            Update(fd(nod),div+1,dr);
      Arb[nod].a=max(Arb[fs(nod)].a,Arb[fs(nod)].d+Arb[fd(nod)].a);
      Arb[nod].b=max(Arb[fd(nod)].b,Arb[fs(nod)].b+Arb[fd(nod)].d);
      Arb[nod].c=max( max(Arb[fs(nod)].c,Arb[fd(nod)].c), Arb[fs(nod)].b+Arb[fd(nod)].a);
      Arb[nod].d=Arb[fs(nod)].d+Arb[fd(nod)].d;
}

void Query(int nod,int st,int dr)
{
      if(A<=st && dr<=B)
      {
            if(Sum<0)
                  Sum=0;
            Max=max(Max, max(Arb[nod].c,Sum+Arb[nod].a));
            Sum=max(Sum+Arb[nod].d,Arb[nod].b);
            return;
      }
      int div=(st+dr)/2;
      if(A<=div)
            Query(fs(nod),st,div);
      if(div<B)
            Query(fd(nod),div+1,dr);
}

int main()
{
      freopen("sequencequery.in","r",stdin);
      freopen("sequencequery.out","w",stdout);
      scanf("%d%d",&N,&M);
      for(i=1;i<=N;i++)
      {
            scanf("%d",&V[i]);
            Val=V[i]; Pos=i;
            Update(1,1,N);
      }

      for(i=1;i<=M;i++)
      {
            scanf("%d%d",&A,&B);
            Max=V[A]; Sum=0;
            Query(1,1,N);
            printf("%lld\n",Max);
      }

      return 0;
}