Cod sursa(job #1607559)

Utilizator vladrochianVlad Rochian vladrochian Data 21 februarie 2016 13:19:32
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>

using namespace std;

const int N_MAX = 1e5;
const int64_t INF = 1e18;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

int N, M;
int a[N_MAX + 5];

struct { int64_t s, l, r, m; } st[4 * N_MAX + 5];

void Build(int node, int l, int r) {
   if (l == r) {
      st[node].s = a[l];
      st[node].l = a[l];
      st[node].r = a[l];
      st[node].m = a[l];
      return;
   }

   int m = (l + r) >> 1;
   int ls = node << 1, rs = ls | 1;

   Build(ls, l, m);
   Build(rs, m + 1, r);

   st[node].s = st[ls].s + st[rs].s;
   st[node].l = max(st[ls].l, st[ls].s + st[rs].l);
   st[node].r = max(st[rs].r, st[ls].r + st[rs].s);
   st[node].m = max(max(st[ls].m, st[rs].m), st[ls].r + st[rs].l);
}

void Query(int node, int l, int r, int ql, int qr, int64_t& best, int64_t& ans) {
   if (qr < l || r < ql)
      return;

   if (ql <= l && r <= qr) {
      ans = max(ans, max(st[node].m, best + st[node].l));
      best = max(best + st[node].s, st[node].r);
      return;
   }

   int m = (l + r) >> 1;
   int ls = node << 1, rs = ls | 1;

   Query(ls, l, m, ql, qr, best, ans);
   Query(rs, m + 1, r, ql, qr, best, ans);
}

int main() {
   fin >> N >> M;
   for (int i = 1; i <= N; ++i)
      fin >> a[i];

   Build(1, 1, N);

   while (M--) {
      int l, r;
      fin >> l >> r;

      int64_t best = -INF, ans = -INF;
      Query(1, 1, N, l, r, best, ans);

      fout << ans << "\n";
   }
   return 0;
}