ST 表

luogu 的评测,不用 fastio 容易超时。

这里维护的是最大值。

void solve() {
  int n = read(), m = read();
  vector<int> a(n);
  vector<array<int, 20>> f(n);
  for (int i = 0; i < n; ++i) {
    f[i][0] = a[i] = read();
  }
  // init
  for (int j = 1; j < 20; ++j) {
    for (int i = 0; i < n - (1 << j) + 1; ++i) {
      f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
    }
  }
  while (m--) {
    int l = read(), r = read();
    --l, --r;
    int l2 = log2(r - l + 1);
    write(max(f[l][l2], f[r - (1 << l2) + 1][l2]));
    putchar('\n');
  }
}