Cod sursa(job #277403)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 11 martie 2009 18:28:22
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#define maxn 100001*5

using namespace std;

int arb1[maxn],arb2[maxn],arb3[maxn],arb4[maxn];

int n,m,sir[maxn];
int start,finish,sum,max;

int maxim(int a,int b)
{
     return a>b?a:b;
}

void baga(int nod,int st,int dr)
{
     if(st==dr)
     {
          arb1[nod]=arb2[nod]=arb3[nod]=arb4[nod]=sir[st];
          return ;
     }
     int mij=(st+dr)/2;
     int stanga=nod*2;
     int dreapta=2*nod+1;
     baga(stanga,st,mij);
     baga(dreapta,mij+1,dr);
     arb1[nod]=maxim(arb1[stanga],arb4[stanga]+arb1[dreapta]);
     arb2[nod]=maxim(arb2[dreapta],arb4[dreapta]+arb2[stanga]);
     arb3[nod]=maxim(arb3[dreapta],arb3[stanga]);
     arb3[nod]=maxim(arb3[nod],arb1[dreapta]+arb2[stanga]);
     arb4[nod]=arb4[dreapta]+arb4[stanga];
}

void query(int nod,int st,int dr)
{
     if(st>=start && finish>=dr)
     {
          if (sum<0)
               sum=0;
          max=maxim(max,sum+arb1[nod]);
          max=maxim(max,arb3[nod]);
          sum=maxim(sum+arb4[nod],arb2[nod]);
          return ;
     }
     int mij=(st+dr)/2;
     int stanga=2*nod;
     int dreapta=2*nod+1;
     if(start<=mij)
          query(stanga,st,mij);
     if(finish>mij)
          query(dreapta,mij+1,dr);
}

void solve()
{
     for (int i=0;i<m;i++)
     {
          scanf("%d%d\n",&start,&finish);
          sum=0;
          max=-200000;
          query(1,1,n);
          printf("%d\n",max);
     }
}

int main ()
{
     freopen("sequencequery.in","r",stdin);
     freopen("sequencequery.out","w",stdout);
     scanf("%d%d",&n,&m);
     for(int i=1;i<=n;i++)
          scanf("%d",&sir[i]);
     baga(1,1,n);
     solve();
     return 0;
}