Cod sursa(job #1311183)

Utilizator rangerChihai Mihai ranger Data 7 ianuarie 2015 20:17:43
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>

using namespace std;

ifstream cin("sequencequery.in");
ofstream cout("sequencequery.out");

const int N=100003;
struct data{long long sum,  pre,  suf,  ans;} tree[4*N];
int n,m,i,a[N],x,y;


data make_data(int x)
{
    data d;
    d.sum=d.ans=d.pre=d.suf=x;
    return d;
}

data combine(data a, data b)
{
    data d;
    d.sum=a.sum+b.sum;
    d.ans=max(max(a.ans,b.ans),a.suf+b.pre);
    d.pre=max(a.pre,a.sum+b.pre);
    d.suf=max(b.suf,b.sum+a.suf);
    return d;
}

int build(int k, int l, int r)
{
    if (l==r) tree[k]=make_data(a[l]);
    else{
        int mij=(l+r)/2;
        build(2*k,l,mij);
        build(2*k+1,mij+1,r);
        tree[k]=combine(tree[2*k],tree[2*k+1]);
    }
}

data query(int k, int L, int R, int l, int r)
{
    if (l==L && r==R) return tree[k];
    int mij=(L+R)/2;
    if (r<=mij) return query(2*k,L,mij,l,r);
    if (l>mij) return query(2*k+1,mij+1,R,l,r);
    return combine(
                   query(2*k,L,mij,l,mij),
                   query(2*k+1,mij+1,R,mij+1,r)
                   );
}

int main()
{
    cin>>n>>m;
    for (i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);

    while (m--){
        cin>>x>>y
        ;
        cout<<query(1,1,n,x,y).ans<<"\n";
    }
    return 0;
}