Cod sursa(job #3228819)

Utilizator andreea678Rusu Andreea-Cristina andreea678 Data 11 mai 2024 14:15:17
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <fstream>
#define INF 999999999999999
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
struct nod{
    long long s; ///suma totala
    long long left; ///suma maxima stanga
    long long right; ///suma maxima dreapta
    long long mid; ///suma maxima mijloc

};
nod arb[500005];
int n, m;
long long sum;
int x;
int a,b;
void update(long long node, long long left, long long right, long long val, long long pos){
    if (left==right){
        arb[node].s=val;
        arb[node].left=val;
        arb[node].right=val;
        arb[node].mid=val;
        return;
    }
    long long lson=2*node;
    long long rson=2*node+1;
    long long mij=(left+right)/2;
    if (pos<=mij){
        update(lson, left, mij, val, pos);
    }
    else{
        update(rson, mij+1, right, val, pos);
    }
    arb[node].s = arb[lson].s + arb[rson].s;
    arb[node].left = max(arb[lson].left, arb[lson].s + arb[rson].left);
    arb[node].right = max(arb[rson].right, arb[rson].s+arb[lson].right);
    arb[node].mid = max ( arb[lson].right + arb[rson].left, max(arb[lson].mid, arb[rson].mid));
}
long long query(long long node, long long left, long long right, long long qleft, long long qright){
    if (qleft<=left && qright>=right){
        long long rasp = max(arb[node].mid, sum+arb[node].left);
        sum = max(sum+arb[node].s, arb[node].right);
        return rasp;
    }
    long long lson=2*node;
    long long rson=2*node+1;
    long long mij = (left+right)/2;
    long long ans=-INF;
    if (qleft<=mij){
        ans=max(ans, query(lson, left, mij, qleft, qright));
    }
    if (qright>mij){
        ans=max(ans, query(rson, mij+1, right,qleft,qright));
    }
    return ans;
}
int main()
{
    fin >> n >> m;
    for (int i=1; i<=n; ++i){
        fin >> x;
        update(1,1,n,x,i);
    }
    for (int i=1; i<=m; ++i){
        sum=-INF;
        fin >> a >> b;
        fout << query(1,1,n,a,b)<<'\n';
    }
    return 0;
}