Cod sursa(job #2328238)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 25 ianuarie 2019 15:42:37
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;

#define ll long long

struct node {
  int l; int r; ll sum;
};


node seg[4 * MAXN + 1];

int a[MAXN + 1];
ll s[MAXN + 1];
void build (int st, int dr, int nod) {
  if (st == dr) {
    seg[nod].l = st;
    seg[nod].r = dr;
    seg[nod].sum = a[st];
    return;
  }
  int mij = (st + dr) / 2;
  build (st, mij, nod * 2);
  build (mij + 1, dr, nod * 2 + 1);
  if (s[seg[nod * 2 + 1].r] - s[seg[nod * 2].l - 1] >= max (seg[nod * 2].sum, seg[nod * 2 + 1].sum)) {
    seg[nod].sum = s[seg[nod * 2 + 1].r] - s[seg[nod * 2].l - 1];
    seg[nod].l = seg[2 * nod].l;
    seg[nod].r = seg[2 * nod + 1].r;
  }
  else {
    if (seg[nod * 2].sum > seg[nod * 2 + 1].sum) {
      seg[nod] = seg[nod * 2];
    }
    else
      seg[nod] = seg[nod * 2 + 1];
  }
}
const int INF = 1e9;

ll smax;
int lll, rrr;

void query (int st, int dr, int nod, int x, int y) {
  if (x <= st && dr <= y) {
    if (smax == -INF) {
      smax = seg[nod].sum;
      lll = seg[nod].l;
      rrr = seg[nod].r;
      return;
    }
    int left = min (lll, seg[nod].l);
    int right = max (rrr, seg[nod].r);
    if (s[right] - s[left - 1] > smax) {
      smax = s[right] - s[left - 1];
      lll = left;
      rrr = right;
      return;
    }
    if (seg[nod].sum > smax) {
      smax = seg[nod].sum;
      lll = seg[nod].l;
      rrr = seg[nod].r;
      return;
    }
    return;
  }
  int mij = (st + dr) / 2;
  if (x <= mij)
    query (st, mij, nod * 2, x, y);
  if (y > mij)
    query (mij + 1, dr, nod * 2 + 1, x, y);
}


int main() {
  int n, q, i, x, y;

  freopen ("sequencequery.in", "r", stdin);
  freopen ("sequencequery.out", "w", stdout);

  scanf ("%d%d", &n, &q);

  for (i = 1; i <= n; i++) {
    scanf ("%d", &a[i]);
    s[i] = s[i - 1] + a[i];
  }

  build (1, n, 1);

  while (q--) {
    scanf ("%d%d", &x, &y);
    smax = -INF;
    query (1, n, 1, x, y);
    printf ("%lld\n", smax);
  }

  return 0;
}