Cod sursa(job #2391048)

Utilizator lucametehauDart Monkey lucametehau Data 28 martie 2019 17:05:28
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>

using namespace std;

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

int n, q, x, y;

struct Arbint {
  long long mx, sum, pref, suff;
} aint[400005];

Arbint best(Arbint st, Arbint dr) {
  Arbint nod;
  nod.mx = max(max(st.mx, dr.mx), st.suff + dr.pref);
  nod.sum = st.sum + dr.sum;
  nod.pref = max(st.pref, st.sum + dr.pref);
  nod.suff = max(dr.suff, dr.sum + st.suff);
  return nod;
}

void update(int nod, int st, int dr, int poz, int val) {
  if(st == dr) {
    aint[nod] = {val, val, val, val};
    return;
  }
  int mid = (st + dr) >> 1;
  if(poz <= mid)
    update(2 * nod, st, mid, poz, val);
  else
    update(2 * nod + 1, mid + 1, dr, poz, val);
  aint[nod] = best(aint[2 * nod], aint[2 * nod + 1]);
}

Arbint query(int nod, int st, int dr, int l, int r) {
  if(l <= st && dr <= r)
    return aint[nod];
  int mid = (st + dr) >> 1;
  if(r <= mid)
    return query(2 * nod, st, mid, l, r);
  else if(mid < l)
    return query(2 * nod + 1, mid + 1, dr, l, r);
  else
    return best(query(2 * nod, st, mid, l, mid), query(2 * nod + 1, mid + 1, dr, mid + 1, r));
}

int main() {
  cin >> n >> q;
  for(int i = 1; i <= n; i++) {
    cin >> x;
    update(1, 1, n, i, x);
  }
  for(; q; q--) {
    cin >> x >> y;
    cout << query(1, 1, n, x, y).mx << "\n";
  }
  return 0;
}