/* created by chjshen, date: 2024-02-01 15:29 */
#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];
struct SegmentTree
{
    int l, r;
    int mx;
} t[N << 2];
void build(int fa, int L, int R) // 建立树
{
    t[fa].l = L, t[fa].r = R; // fa 当前结点, L =    , R= 
    if (L == R) // 叶结点
    {
        t[fa].mx = a[L];
        return; // 递归的终止条件
    }
    int mid = (L + R) >> 1;
    build(fa << 1, L, mid); // 建立左儿子的子树
    build(fa << 1 | 1, mid + 1, R); // 右儿子
    t[fa].mx = max(t[fa << 1].mx, t[fa << 1 | 1].mx);
}

int query(int fa, int l, int r)
{
    if (l <= t[fa].l && t[fa].r <= r)
    {
        return t[fa].mx;
    }
    int mid = (t[fa].l + t[fa].r) >> 1;
    int ans = -INF;
    if (l <= mid) ans = max(ans, query(fa << 1, l, r));
    if (mid < r) ans = max(ans, query(fa << 1 | 1, l, r));
    return ans;
}
void handle(void)
{
    while (m--)
    {
        int x, y;
        cin >> x >> y;
        cout << query(1, x, y) << endl;
    }
}
void initInput(void)
{
    ios::sync_with_stdio(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    build(1, 1, n);
}
signed main(void)
{
    initInput();
    handle();
    return 0;
}

4 条评论

  • 1

信息

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