/* POJ_3264_Interval Tree 最大最小值之差 Author : a_clay 2014/05/08 */ #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <algorithm> #define mid(x) ((x) >> 1) using namespace std; const int N = 50005; int MAX = 0x80000000; int MIN = 0x7fffffff; int r[N]; int n, m; struct node { int a, b; int mmax; int mmin; }t[3*N]; void make_tree(int x, int y, int num) { t[num].a = x; t[num].b = y; if (x == y) { t[num].mmax = r[y]; t[num].mmin = r[y]; return; } else { make_tree(x, mid(x+y), 2*num); make_tree(mid(x+y)+1, y, 2*num+1); t[num].mmax = max(t[2*num].mmax, t[2*num+1].mmax); t[num].mmin = min(t[2*num].mmin, t[2*num+1].mmin); } } void query(int x, int y, int num) { if (x <= t[num].a && t[num].b <= y) { MAX = max(MAX, t[num].mmax); MIN = min(MIN, t[num].mmin); } else { int middle = mid(t[num].a + t[num].b); if (x <= middle) { query(x, y, 2*num); } if (y > middle) { query(x, y, 2*num+1); } } } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", &r[i]); } make_tree(1, n, 1); while (m--) { int a, b; scanf("%d%d", &a, &b); MAX = 0x80000000; MIN = 0x7fffffff; query(a, b, 1); printf("%d\n", MAX-MIN); } return 0; }
POJ_3264_Interval Tree 最大最小值之差
转载
-
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
POJ 3045 Cow Acrobats (最大化最小值)
题目链接:click here~~【题目大意】给你n头牛叠罗汉,每头都有自己的重量w和力量s,承
ACM 排序 #include i++ ios