#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn = 50005;
pair<int, int> tree[maxn << 4];
void build(int l, int r,int k)
{
if(l == r)
{
scanf("%d", &tree[k].first);
tree[k].second = tree[k].first;
return ;
}
int mid = l + r >> 1;
build(l, mid, k << 1);
build(mid + 1, r, k << 1|1);
tree[k].first = max(tree[k<<1].first, tree[k<<1|1].first);
tree[k].second = min(tree[k<<1].second, tree[k<<1|1].second);
}
pair<int, int> query(int l, int r, int x, int y, int k)
{
if(x <= l && y >= r)
{
return tree[k];
}
int mid = l + r >> 1;
pair<int, int> p1(INT_MIN, INT_MAX), q1(INT_MIN,INT_MAX);
if(x <= mid) p1 = query(l, mid, x, y, k<<1);
if(y > mid) q1 = query(mid + 1, r, x, y, k << 1 | 1);
return make_pair(max(p1.first, q1.first), min(p1.second, q1.second));
}
int main()
{
int n, m;
cin >> n >> m;
build(1, n, 1);
for(int i = 1; i <= m; i++)
{
int a, b;
scanf("%d %d", &a, &b);
pair<int, int> q;
q = query(1, n, a, b, 1);
printf("%d\n",q.first - q.second);
}
return 0;
}
G - Balanced Lineup //线段树模板题区间查询
猜你喜欢
转载自blog.csdn.net/qq_45778406/article/details/107582837
今日推荐
周排行