Cod sursa(job #2158738)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 10 martie 2018 15:50:57
Problema SequenceQuery Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <cstdio>
#include <algorithm>
using namespace std;
 
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;

int n, m, a[MAXN];
int result, lastsuf;
 
struct {
  int suma, pref, suf, best;
  void init(int k) {
    suma = pref = suf = best = a[k];
  }
}tree[4 * MAXN];
 
#define left(x) (x << 1)
#define right(x) ((x << 1) + 1)

#define max3(x, y, z) (max(max((x), (y)), (z)))
 
void read() {
  scanf("%d %d ", &n, &m);
  for (int i = 1; i <= n; i++)
    scanf("%d ", &a[i]);
}
 
void build(int st = 1, int dr = n, int node = 1) {
  if (st == dr) {
    tree[node].init(st);
    return;
  }
 
  int mid = (st + dr) >> 1;
 
  build(st, mid, left(node));
  build(mid + 1, dr, right(node));
 
  tree[node].suma = tree[left(node)].suma + tree[right(node)].suma;
  tree[node].pref = max(tree[left(node)].pref, tree[left(node)].suma + tree[right(node)].pref);
  tree[node].suf = max(tree[right(node)].suf, tree[right(node)].suma + tree[left(node)].suf);
  tree[node].best = max3(tree[left(node)].best, tree[right(node)].best, tree[left(node)].suf + tree[right(node)].pref);
}
 
void query(int qst, int qdr, int st = 1, int dr = n, int node = 1) {
  if (qst <= st && qdr >= dr) {
    result = max3(result, tree[node].best, lastsuf + tree[node].pref);
    lastsuf = max(lastsuf + tree[node].suma, tree[node].suf);
    return;
  }
 
  if(st >= dr)
      return;
 
  int mid = (st + dr) >> 1;
 
  if (qst <= mid)
    query(qst, qdr, st, mid, left(node));
  if (dr > mid)
    query(qst, qdr, mid + 1, dr, right(node));
}
 
void solve() {
  int a, b;
  for (int i = 1; i <= m; i++) {
    scanf("%d %d ", &a, &b);
    result = lastsuf = -INF;
    query(a, b);
    printf("%d\n", result);
  }
}

int main() {
  freopen("sequencequery.in", "r", stdin);
  freopen("sequencequery.out", "w", stdout);
 
  read();
  build();
  solve();
 
  return 0;
}