蒟蒻线段树求助
  • 板块P1816 忠诚
  • 楼主creation_hy
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/8/2 13:49
  • 上次更新2023/10/27 17:23:00
查看原帖
蒟蒻线段树求助
576378
creation_hy楼主2022/8/2 13:49
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int m, n, a[MAXN], t[MAXN << 2]; // Segment Tree
int q_l, q_r;
// only query, so no need to write about modify.
inline int ls(int p)
{
    return p << 1;
}
inline int rs(int p)
{
    return p << 1 | 1;
}
inline void push_up(int p)
{
    t[p] = min(t[ls(p)], t[rs(p)]);
}
void build(int p, int l, int r)
{
    if (l == r)
    {
        t[p] = a[p];
        return;
    }
    int mid = l + r >> 1;
    build(ls(p), l, mid);
    build(rs(p), mid + 1, r);
    push_up(p);
}
int query(int qx, int qy, int l, int r, int p)
{
    int res = 0;
    if (qx <= l && qy >= r)
        return t[p];
    int mid = l + r >> 1;
    if (qx <= mid)
        return query(qx, qy, l, mid, ls(p));
    if (qy > mid)
        return query(qx, qy, mid + 1, r, rs(p));
    res = min(query(qx, mid, l, r, ls(p)), query(mid + 1, qy, l, r, rs(p)));
    return res;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> m >> n;
    for (int i = 1; i <= m; i++)
        cin >> a[i];
    build(1, 1, m);
    for (int i = 1; i <= n; i++)
    {
        cin >> q_l >> q_r;
        cout << query(q_l, q_r, 1, m, 1) << ' ';
    }
    return 0;
}

输入

10 3
1 2 3 4 5 6 7 8 9 10
2 7
3 9
1 10

输出

090

QAQ

2022/8/2 13:49
加载中...