ST表

P2880 [USACO07JAN] Balanced Lineup G

思路
没有操作,只有区间查询,考虑用ST表去维护区间 \(max\)\(min\)
代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N = 5e4+5;
ll log_2[N], mx[N][18], mn[N][18];
int n, q;
void init(){
	for(int j=1; (1<<j) <=n; ++j)
		for(int i=1; i + (1<<j) - 1 <=n; ++i){
			mx[i][j] = max(mx[i][j-1], mx[i+(1<<j-1)][j-1]);
			mn[i][j] = min(mn[i][j-1], mn[i+(1<<j-1)][j-1]);
		}
}
int main(){
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> q;
	for(int i=1, a; i<=n; ++i){
		cin >> a;
		mx[i][0] = mn[i][0] = a;
	}
	for(int i=2; i<=n; ++i){
		log_2[i] = log_2[i>>1] + 1;
	}
	init();
	while(q--){
		int l, r;
		cin >> l >> r;
		ll x = log_2[r-l+1];
		ll Max = max(mx[l][x], mx[r - (1<<x) + 1][x]);
		ll Min = min(mn[l][x], mn[r - (1<<x) + 1][x]);
		cout << Max - Min << '\n';
	}
	return 0;
}

posted @ 2026-09-23 00:00  williamYcY  阅读(5)  评论(0)    收藏  举报
/* */ /* */ /* */ /* */ /* */ /* */