线段树求调
查看原帖
线段树求调
1041907
back_楼主2024/8/12 16:05
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 3;
int n, q;
int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch <= '9' && ch >= '0')
        x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    return x * f;
}
struct tree
{
	int l, r, minn, maxx;
}tr[N];
#define ls(x) x << 1
#define rs(x) x << 1 | 1
void push_up(int p)
{
	tr[p].maxx = max(tr[ls(p)].maxx, tr[rs(p)].maxx);
	tr[p].minn = min(tr[ls(p)].minn, tr[rs(p)].minn);
}
void build(int p, int l, int r)
{
	tr[p].l = l, tr[p].r = r;
	if(l == r)
	{
		tr[p].maxx = tr[p].minn = read(); return;
	}
	int mid = l + r >> 1;
	build(ls(p), l, mid), build(rs(p), mid + 1, r);
	push_up(p); 
}
int query_min(int p, int l, int r)
{
	if(l <= tr[p].l && tr[p].r <= r) return tr[p].minn;
	int mid = tr[p].l + tr[p].r >> 1, ans = 1e9+7;
	if(l <= mid) ans = min(ans, query_min(ls(p), l ,r));
	if(r > mid) ans = min(ans, query_min(rs(p), l, r));
	return ans;
}
int query_max(int p, int l, int r)
{
	if(l <= tr[p].l && tr[p].r <= r) return tr[p].maxx;
	int mid = tr[p].l + tr[p].r >> 1, ans = -1;
	if(l <= mid) ans = max(ans, query_max(ls(p), l, r));
	if(r > mid) ans = max(ans, query_max(rs(p), l, r));
	return ans;
}
void ansprint(int x, int y)
{
	printf("%d\n", query_max(1, x, y) - query_min(1, x, y));
}
int main()
{
	n = read(), q = read();
	build(1, 1, n);
	while(q --)
		ansprint(read(), read());
	return 0;
}
2024/8/12 16:05
加载中...