Cod sursa(job #2427114)

Utilizator vladth11Vlad Haivas vladth11 Data 30 mai 2019 22:01:38
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>

using namespace std;
ifstream cin("sequencequery.in");
ofstream cout("sequencequery.out");
struct Nod{
    long long maxim,st,dr,sum;
}aint[400001];
Nod best(Nod left, Nod right){
    Nod rez;
    rez.sum = left.sum + right.sum;
    rez.st = max(left.st,left.sum + right.st);
    rez.dr = max(right.dr,right.sum + left.dr);
    rez.maxim = max(left.maxim,max(right.maxim,max(rez.st,max(rez.dr,left.dr + right.st))));
    return rez;
}
void update(long long nod,long long st,long long dr,long long poz,long long val){
    if(st == dr){
        aint[nod].sum =aint[nod].dr = aint[nod].st = aint[nod].maxim= val;
        return;
    }
    long long mid = st + dr;
    mid /= 2;
    if(poz <= mid){
        update(nod * 2,st,mid,poz,val);
    }else{
        update(nod * 2 + 1,mid + 1,dr,poz,val);
    }
    aint[nod] = best(aint[nod * 2],aint[nod * 2 + 1]);
}
Nod query(long long nod,long long st,long long dr,long long a, long long b){
    if(a <= st && dr <= b){
        return aint[nod];
    }
    long long mid = st + dr;
    mid /= 2;
    if(a <= mid && b > mid)
        return best(query(nod * 2,st,mid,a,b),query(nod * 2 + 1,mid + 1,dr,a,b));
    else if(a <= mid)
        return query(nod * 2,st,mid,a,b);
    else if(b > mid)
        return query(nod * 2 + 1,mid + 1,dr,a,b);
}
int main()
{
    long long n,m,x,y,i;
    cin >> n >> m;
    for(i = 1;i <= n;i++){
        cin >> x;
        update(1,1,n,i,x);
    }
    for( i= 1;i <= m;i++){
        cin >> x >> y;
        cout << query(1,1,n,x,y).maxim << "\n";
    }
    return 0;
}