链接:http://poj.org/problem?id=3264
题意:n个牛m个操作,问你第[i, j]之间最高的牛和最低的牛的高度差是多少
解题思路: 保存最大值最小值就可以了, 模板稍微改改就可以
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>
#define LL long long
#define lson ins<<1
#define rson ins<<1|1
#define mid (l+r)/2
const int Max = 51000;
using namespace std;
struct node {
int l, r;
int sum, max1, min1, lazy;
} tree[Max << 2];
int data[Max << 2];
void push_up(int ins) {
tree[ins].max1 = max(tree[lson].max1, tree[rson].max1);
tree[ins].min1 = min(tree[lson].min1, tree[rson].min1);
}
void build(int l, int r, int ins) {
tree[ins].l = l, tree[ins].r = r, tree[ins].sum = tree[ins].max1 = tree[ins].min1 = 0;
if (l == r) {
tree[ins].min1 = tree[ins].max1 = data[l];
} else {
build(l, mid, lson);
build(mid + 1, r, rson);
push_up(ins);
}
}
int ans1, ans2;
void query(int ql, int qr, int ins) {
int l = tree[ins].l, r = tree[ins].r;
if (l >= ql && r <= qr) {
ans1 = max(ans1, tree[ins].max1);
ans2 = min(ans2, tree[ins].min1);
} else {
if (ql <= mid)query(ql, qr, lson);
if (qr > mid)query(ql, qr, rson);
}
}
int main() {
int n, m;
while (~scanf("%d%d", &n, &m)) {
for (int a = 1; a <= n; a++) {
scanf("%d", &data[a]);
}
build(1, n, 1);
for (int a = 1; a <= m; a++) {
int i, j;
ans1 = 0;
ans2 = (int) 1e9;
scanf("%d%d", &i, &j);
query(i, j, 1);
printf("%d\n", ans1 - ans2);
}
}
return 0;
}