#include <stdio.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) > (b) ? (b) : (a))
#define MAXN 50000
int num[MAXN] = {0};
struct SegmentTree
{
int left;
int right;
int maxValue;
int minValue;
}dwSegmen[4 * MAXN];
int maxValue = 0;
int minValue = 0;
void constrcutMax(int index, int left, int right)
{
dwSegmen[index].left = left;
dwSegmen[index].right = right;
if (left == right)
{
dwSegmen[index].maxValue = dwSegmen[index].minValue = num[left];
return;
}
int mid = (left + right) >> 1;
constrcutMax((index << 1) + 1, left, mid);
constrcutMax((index << 1) + 2, mid + 1, right);
dwSegmen[index].maxValue = MAX(dwSegmen[(index << 1) + 1].maxValue, dwSegmen[(index << 1) + 2].maxValue);
dwSegmen[index].minValue = MIN(dwSegmen[(index << 1) + 1].minValue, dwSegmen[(index << 1) + 2].minValue);
}
void QueryMax(int index, int left, int right)
{
if (dwSegmen[index].left == left && dwSegmen[index].right == right)
{
maxValue = maxValue > dwSegmen[index].maxValue ? maxValue : dwSegmen[index].maxValue;
minValue = minValue < dwSegmen[index].minValue ? minValue : dwSegmen[index].minValue;
return;
}
int mid = (dwSegmen[index].left + dwSegmen[index].right) >> 1;
if (right <= mid)
{
QueryMax((index << 1) + 1, left, right);
}
else if (left > mid)
{
QueryMax((index << 1) + 2, left, right);
}
else
{
QueryMax((index << 1) + 1, left, mid);
QueryMax((index << 1) +2, mid + 1, right);
}
}
int main()
{
int n = 0;
int q = 0;
scanf("%d %d",&n, &q);
for (int i = 0; i < n; ++i)
{
scanf("%d",&num[i]);
}
constrcutMax(0, 0, n - 1);
while (q--)
{
int a = 0;
int b = 0;
scanf("%d %d",&a, &b);
if (a > b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
maxValue = 0;
minValue = 1000001;
QueryMax(0, a - 1, b - 1);
printf("%d\n",maxValue - minValue);
}
return 0;
}
线段树--求区间最大差值
最新推荐文章于 2023-07-15 21:38:03 发布