Cod sursa(job #942772)

Utilizator dariusdariusMarian Darius dariusdarius Data 23 aprilie 2013 15:29:47
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
struct T
{
    long long sum,pref,suf,ans;
};
int N,Q;
T sol,aint[600005];
void recompute(T &A,T B,T C)
{
    A.sum=B.sum+C.sum;
    A.pref=max(B.pref,B.sum+C.pref);
    A.suf=max(C.suf,B.suf+C.sum);
    A.ans=max(B.suf+C.pref,max(B.ans,C.ans));
}
inline void update(int nod,int st,int dr,int pos,int value)
{
    if(st==dr)
    {
        aint[nod].sum=value;
        aint[nod].pref=value;
        aint[nod].suf=value;
        aint[nod].ans=value;
        return;
    }
    int med=(st+dr)/2;
    if(pos <= med)
        update(2*nod,st,med,pos,value);
    else
        update(2*nod+1,med+1,dr,pos,value);
    recompute(aint[nod],aint[2*nod],aint[2*nod+1]);
}
inline void query(int nod,int st,int dr,int x,int y)
{
    if(dr<x || y<st)
        return;
    if(x<=st && dr<=y)
    {
        recompute(sol,sol,aint[nod]);
        return;
    }
    int med=(st+dr)/2;
    if(med>=x)
        query(2*nod,st,med,x,y);
    if(med+1<=y)
        query(2*nod+1,med+1,dr,x,y);
}
int main()
{
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    int x,y;
    scanf("%d%d",&N,&Q);
    for(int i=1;i<=N;++i)
    {
        scanf("%d",&x);
        update(1,1,N,i,x);
    }
    for(int i=1;i<=Q;++i)
    {
        scanf("%d%d",&x,&y);
        sol.sum=sol.suf=sol.pref=0;
        sol.ans=-1000000000;
        query(1,1,N,x,y);
        printf("%lld\n",sol.ans);
    }
    return 0;
}