block:

/* created by chjshen, date: 2024-01-31 13:54 */
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int n, m, a[N], mx[N], L[N], R[N], pos[N];
int bl, bn;  // block len   , block num
void handle(void)
{
    int x, y;
    int ans = -1e18;
    scanf("%lld%lld", &x, &y);
    int lb = pos[x], rb = pos[y];
    if (lb == rb)
    {
        // force it
        for (int i = x; i <= y; i++) ans = max(ans, a[i]);
    }
    else
    {
        // 1. 搞前面那个块, force it
        for (int i = x; i <= R[lb]; i++) ans = max(ans, a[i]);
        // 2. 搞完整的那些块
        for (int i = lb + 1; i <= rb - 1; i++) ans = max(ans, mx[i]);
        // 3.搞后面的那个块,force it
        for (int i = L[rb]; i <= y; i++) ans = max(ans, a[i]);
    }
    printf("%lld\n", ans);
}
void initInput(void)
{
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &a[i]);
        mx[i] = -1E18;
    }
    // block init
    bl = sqrt(n);
    bn = n / bl;
    for (int i = 1; i <= bn; i++)
    {
        L[i] = (i - 1) * bl + 1;
        R[i] = i * bl;
        for (int j = L[i]; j <= R[i]; j++)
        {
            mx[i] = max(mx[i], a[j]);
            pos[j] = i;
        }
    }
    if (n > bl * bn)
    {
        bn++;
        L[bn] = (bn - 1) * bl + 1;
        R[bn] = n;
        for (int j = L[bn]; j <= R[bn]; j++) mx[bn] = max(mx[bn], a[j]), pos[j] = bn;
    }
    while (m--) handle();
}

signed main(void)
{
    initInput();
    return 0;
}

3 条评论

  • @ 2024-1-31 14:27:46

    %%%%

    • @ 2024-1-31 14:10:24

      st table:

      /* created by chjshen, date: 2024-01-31 13:22 */
      #include <cstdio>
      #include <iostream>
      using namespace std;
      #define int long long
      const int N = 1E5 + 5;
      const int INF = 1E18;
      int n, m, a[N], f[N][30];
      int mlg[N];
      void handle(void)
      {
          int L, R;
          scanf("%lld%lld", &L, &R);
          int len = R - L + 1;
          int ans = max(f[L][mlg[len]], f[R - (1 << mlg[len]) + 1][mlg[len]]);
          printf("%lld\n", ans);
      }
      void initInput(void)
      {
          scanf("%lld%lld", &n, &m);
          for (int i = 1; i <= n; i++)
          {
              scanf("%lld", &a[i]);
              f[i][0] = a[i];
          }
          mlg[1] = 0;
          for (int i = 2; i < N; i++) mlg[i] = mlg[i / 2] + 1;
          for (int j = 1; j <= 20; j++)
          {
              for (int i = 1; i <= n - (1 << j) + 1; i++)
              {
                  f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
              }
          }
          while (m--) handle();
      }
      signed main(void)
      {
          initInput();
          return 0;
      }
      
      
      • @ 2024-1-31 14:10:13

        qp

        • 1

        信息

        ID
        1720
        时间
        1000ms
        内存
        256MiB
        难度
        9
        标签
        递交数
        483
        已通过
        46
        上传者
        }