Cod sursa(job #13359)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 6 februarie 2007 13:37:10
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>

#define maxn 100100
#define maxx 262144
#define maxv -100000000000LL
#define ll long long

int n,m,l,px,py;
int a[maxn];
ll sum[maxx],max[maxx],st[maxx],dr[maxx];

void query(int p,int r,int nod,ll &sol,ll &x,ll &y,ll &s)
{
     if ((px<=p) && (r<=py))
     {
         sol=max[nod];
         x=st[nod];
         y=dr[nod];
         s=sum[nod];
     }
     else {
			   int q=(p+r)/2;
               ll aux1=maxv,aux2=maxv,aux3=maxv,aux4=0;
               
               if (px<=q) query(p,q,nod*2,sol,x,aux3,s);
               if (q<py) query(q+1,r,nod*2+1,aux1,aux2,y,aux4);
               
               if (aux1>sol) sol=aux1;
               if (aux3+aux2>sol) sol=aux3+aux2;
               if (s+aux2>x) x=s+aux2;
               if (aux4+aux3>y) y=aux4+aux3;
               s=s+aux4;
          }
}

int main()
{
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    
    scanf("%d %d ",&n,&m);
    int aux=n,i;
    ll x,y,sol,s;
    
    for (i=1;i<=n;i++) scanf("%d ",&a[i]);
    
    l=1;
    while (aux>0)
    {
       l<<=1;
       aux>>=1;
    }
        
    for (i=l;i<l+n;i++) 
    {
        max[i]=a[i-l+1];
        sum[i]=a[i-l+1];
        st[i]=a[i-l+1];
        dr[i]=a[i-l+1];
    }
    
    for (i=l-1;i>0;i--)
    {
        sum[i]=sum[i*2]+sum[i*2+1];
        max[i]=max[i*2];
        if (max[i*2+1]>max[i]) max[i]=max[i*2+1];
        if (dr[i*2]+st[i*2+1]>max[i]) max[i]=dr[i*2]+st[i*2+1];
        st[i]=st[i*2];
        if (sum[i*2]+st[i*2+1]>st[i]) st[i]=sum[i*2]+st[i*2+1];
        dr[i]=dr[i*2+1];
        if (sum[i*2+1]+dr[i*2]>dr[i]) dr[i]=sum[i*2+1]+dr[i*2];
    }
    
    for (i=1;i<=m;i++)
    {
        scanf("%d %d",&px,&py);

		s=0;
		x=maxv;
		sol=maxv;
		y=maxv;
		query(1,l,1,sol,x,y,s);
        printf("%lld\n",sol);
    }
    
    return 0;
}