传送门:http://poj.org/problem?id=3264
代码附上:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1010000;
int tree_max[maxn];
int tree_min[maxn];
int h[maxn];
int mh;
int nh;
void build_tree(int s, int e, int i)
{
if(s == e)
{
tree_max[i] = h[s];
tree_min[i] = h[s];
return ;
}
int mid = ( s + e ) / 2;
build_tree(s, mid, i * 2 + 1);
build_tree(mid + 1, e, i * 2 + 2);
tree_max[i] = max(tree_max[i * 2 + 1],tree_max[i * 2 + 2]);
tree_min[i] = min(tree_min[i * 2 + 1],tree_min[i * 2 + 2]);
return ;
}
void find_mn(int s, int e, int left, int right, int i)
{
if(s == left && e == right)
{
if(tree_max[i] > mh) mh = tree_max[i];
if(tree_min[i] < nh) nh = tree_min[i];
return ;
}
int mid = ( s + e ) / 2;
if(mid >= right) find_mn(s, mid, left, right, i * 2 + 1);
else if(mid < left) find_mn(mid + 1, e, left, right, i * 2 + 2);
else
{
find_mn(s, mid, left, mid, i * 2 + 1);
find_mn(mid + 1, e, mid + 1, right, i * 2 + 2);
}
return;
}
int main()
{
int n, q;
scanf("%d %d", &n, &q);
for (int i = 0; i < n ; i++)
scanf("%d",&h[i]);
memset(tree_max, 0, sizeof(tree_max));
memset(tree_min, 0, sizeof(tree_min));
build_tree(0, n - 1, 0);
for (int i = 0; i < q; i++)
{
int left, right;
scanf("%d %d", &left, &right);
mh = -1;
nh = maxn;
find_mn(0, n - 1, left - 1, right - 1, 0);
printf("%d\n",mh - nh);
}
}