您的位置:首页 > 其它

luogu 1816忠诚 线段树

2017-12-14 23:25 246 查看
区间最值

不带修改的线段树……我应该去学一下RMQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100007;

int m, n, tree[maxn << 2];//lch[maxn << 2], rch[maxn << 2];
void build(int num, int l, int r) {
//lch[num] = l;
//rch[num] = r;
int mid = (l + r) >> 1;
if (l == r) { scanf("%d", &tree[num]); return; }
build(num << 1, l, mid);
build(num << 1 | 1, mid + 1, r);
tree[num] = min(tree[num<< 1], tree[num<< 1 | 1]);

}

int query(int num, int x, int y, int l, int r) {
int mid = (l + r) >> 1;
if (x <= l&&r <= y) return tree[num];
int ans = maxn * 100;
if (x <= mid) ans = min(ans, query(num<< 1, x, y, l, mid));
if (y > mid) ans = min(ans, query(num<< 1 | 1, x, y, mid + 1, r));
return ans;
}
int main() {
cin >> m >> n;
build(1, 1, m);
while (n--) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", query(1, a, b, 1, m));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: