/*
分桶法/块状数组
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX_N 50000
#define B 250
#define INF 0x3f3f3f
typedef long long ll;
int N;
int Q,a,b;
void solve(int arr[]){
vector <int> backet[MAX_N / B];
for(int i = 0;i < N; i++){
backet[i / B].push_back(arr[i]);
}
//对每个桶进行排序
for(int i = 0;i <=N / B; i++)
sort(backet[i].begin(), backet[i].end());
/*for(int i = 1;i <= N; i++)
printf("%d ", arr[i]);
printf("\n");
*/
for(int i = 0;i < Q; i++){
scanf("%d%d", &a, &b);
int l = a, r = b+1;
int maxx = 0, minn = INF;
if(l == r) {printf("0\n"); continue;}
//对桶外元素进行查找
while(l < r && l % B != 0) {
if(arr[l] > maxx)
maxx = arr[l];
if(arr[l] < minn)
minn = arr[l];
l++;
}
while(l < r && r % B != 0){
if(arr[r] < minn)
minn = arr[r];
if(arr[r] > maxx)
maxx = arr[r];
}
//对桶内元素进行查找
while(l < r){
vector <int>::iterator it;
it = backet[l/B].begin();
minn = min(*it, minn);
it = backet[l/B].end();
maxx = max(*it, maxx);
l += B;
}
int ans = maxx - minn;
printf("%d\n", ans);
}
}
int main(){
scanf("%d%d", &N, &Q);
int arr[MAX_N];
memset(arr, 0, sizeof(arr));
for(int i = 1;i <= N; i++){
scanf("%d", &arr[i]);
}
solve(arr);
return 0;
}
poj 3264 Balanced Lineup
最新推荐文章于 2023-10-07 08:26:33 发布
