#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 50005;
int h[50005], MAX, MIN;
struct node
{
int l, r;
int MAX, MIN;
}tree[MAXN * 4];
void build(int p, int l, int r)
{
tree[p].l = l;
tree[p].r = r;
if(l ==r) {tree[p].MAX = tree[p].MIN = h[l]; return ; }
int mid = (l + r) / 2;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
//tree[p] = tree[p * 2] + tree[p * 2 + 1];
tree[p].MAX = max(tree[p * 2].MAX, tree[p * 2 + 1].MAX);
tree[p].MIN = min(tree[p * 2].MIN, tree[p * 2 + 1].MIN );
}
void find(int l, int r, int p)
{
if(tree[p].l == l && tree[p].r == r)
{
MAX = max(MAX, tree[p].MAX);
MIN = min(MIN, tree[p].MIN);
return ;
}
int mid = (tree[p].r + tree[p].l) / 2;
if(mid >= r) find(l, r, p * 2);
else if(mid < l) find(l, r, p * 2 + 1);
else
{
find(l, mid, p * 2);
find(mid + 1, r, p * 2 + 1);
}
}
int main()
{
int n, p;
//cin >> n >> p;
scanf("%d%d", &n, &p);
for(int i = 1; i <= n; i++)
{
//cin >> h[i];
scanf("%d", &h[i]);
}
build(1, 1, n);
int x, y;
while(p--)
{
//cin >> x >> y;
scanf("%d%d", &x, &y);
MAX = -0xfffff;
MIN = 0xfffff;
find(x, y, 1);
//cout << MAX - MIN << endl;
printf("%d\n", MAX - MIN);
}
return 0;
}
[NWPU][2014][TRN][13]线段树第一讲 B - 基础 POJ 3264
最新推荐文章于 2015-04-14 17:48:19 发布