Cod sursa(job #2816080)

Utilizator LuciBBadea Lucian LuciB Data 10 decembrie 2021 23:43:01
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
using namespace std;
const int NMAX = 1e5, INF = 1e5 + 1;

struct interval {
    long long sum, pref, suf, ssm;
};

int v[NMAX + 1];
interval aint[2 * NMAX + 1];

interval combine(interval a, interval b) {
    interval retval;
    retval.sum = a.sum + b.sum;
    retval.pref = max(a.pref, a.sum + b.pref);
    retval.suf = max(b.suf, b.sum + a.suf);
    retval.ssm = max(max(a.ssm, b.ssm), a.suf + b.pref);
    return retval;
}

void build(int l, int r, int node) {
    int mid, lson, rson;
    
    if(l == r)
        aint[node] = {v[l], v[l], v[l], v[l]};
    else {
        mid = (l + r) / 2;
        lson = node + 1;
        rson = node + 2 * (mid - l + 1);
        build(l, mid, lson);
        build(mid + 1, r, rson);
        aint[node] = combine(aint[lson], aint[rson]);
    }
}

int ql, qr;

interval query(int l, int r, int node) {
    int mid, lson, rson;

    if(qr < l || ql > r) // it's not good at all
        return {-INF, -INF, -INF, -INF};
    if(l >= ql && r <= qr) // very good
        return aint[node];
    
    mid = (l + r) / 2;
    lson = node + 1;
    rson = node + 2 * (mid - l + 1);
    interval left, right;
    left = right = {-INF, -INF, -INF, -INF};
    if(ql <= mid)
        left = query(l, mid, lson);
    if(qr > mid)
        right = query(mid + 1, r, rson);
    
    return combine(left, right);
}

int main() {
    int n, m, i;
    FILE *fin, *fout;
    fin = fopen("sequencequery.in", "r");
    fout = fopen("sequencequery.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i = 1; i <= n; i++)
        fscanf(fin, "%d", &v[i]);
    
    build(1, n, 1);

    for(i = 1; i <= m; i++) {
        fscanf(fin, "%d%d", &ql, &qr);
        fprintf(fout, "%lld\n", query(1, n, 1).ssm);
    }

    fclose(fin);
    fclose(fout);

    return 0;
}