Cod sursa(job #1400198)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 25 martie 2015 10:10:38
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#define NMAX 400001
#define LMAX 100001
long long a[NMAX],b[NMAX],c[NMAX],sum[NMAX];
long long n,m;
long long nr[100001];
long long int ans=0,su=0;
long long max(long long a,long long b)
{
    if(a<b) return b;
    return a;
}
void putsum(int s,int e,int pos,int nod)
{
     if(s==e) sum[nod]=nr[pos];
     else
     {
         int mij=(s+e)/2;
         if(pos<=mij) putsum(s,mij,pos,2*nod);
         else putsum(mij+1,e,pos,2*nod+1);
         sum[nod]=sum[2*nod]+sum[2*nod+1];
     }
}
void update(int s,int e,int pos,int nod)
{
     if(s==e)
     {
             a[nod]=nr[pos];
             b[nod]=nr[pos];
             c[nod]=nr[pos];
     }
     else
     {
         int mij=(s+e)/2;
         if(pos<=mij) update(s,mij,pos,2*nod);
         else update(mij+1,e,pos,2*nod+1);
         a[nod]=max(a[2*nod],sum[2*nod]+a[2*nod+1]);
         b[nod]=max(b[2*nod+1],sum[2*nod+1]+b[2*nod]);
         c[nod]=max(max(c[2*nod],c[2*nod+1]),b[2*nod]+a[2*nod+1]);
     }
}
void query(int s,int e,int p1,int p2,int nod)
{
     if(p1<=s&&e<=p2)
     {
                     ans=max(ans,max(su+a[nod],c[nod]));
                     su=max(su+sum[nod],b[nod]);
     }
     else
     {
         int mij=(s+e)/2;
         if(p1<=mij) query(s,mij,p1,p2,2*nod);
         if(p2>mij) query(mij+1,e,p1,p2,2*nod+1);
     }
}
int main()
{
    freopen ("sequencequery.in","r",stdin);
    freopen ("sequencequery.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
            scanf("%lld",&nr[i]);
            putsum(1,n,i,1);
    }
    for(int i=1;i<=n;i++)  update(1,n,i,1);
    int p1,p2;
    for(int i=1;i<=m;i++)
    {
            ans=-1000000000,su=0;
            scanf("%d%d",&p1,&p2);
            query(1,n,p1,p2,1);  
            printf("%lld\n",ans);
    }
}