G - Balanced Lineup //线段树模板题区间查询

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_45778406/article/details/107582837