题意:
给出n个数字a[1~n],进行m次询问,每次询问包括一个l,r求max(a[l],a[l+1],...,a[r]) - min(a[l],a[l+1],...,a[r])
题解:
RMQ模板
#include<iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include<stdlib.h>
#include <string.h>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<time.h>
using namespace std;
#define MAX_N 50005
#define inf 0x7fffffff
#define LL long long
#define ull unsigned long long
#define mod 1000000007
LL INF=9e18;
int num[MAX_N];
int minsum[MAX_N][20];
int maxsum[MAX_N][20];
void init_RMQ(int n)
{
for(int i=1;i<=n;i++)
maxsum[i][0] = minsum[i][0] = num[i];
int k = log2(1.0*n);
for(int j=1;j<=k;j++) {
for(int i=1;i<=n;i++) {
if(i+(1<<j)-1<=n) {
maxsum[i][j] = max(maxsum[i][j-1], maxsum[i+(1<<(j-1))][j-1]);
minsum[i][j] = min(minsum[i][j-1], minsum[i+(1<<(j-1))][j-1]);
}
}
}
}
int getMax(int i,int j)
{
int k = (int)log2(1.0*(j-i+1));
return max(maxsum[i][k], maxsum[j-(1<<k)+1][k]);
}
int getMin(int i,int j)
{
int k = (int)log2(1.0*(j-i+1));
return min(minsum[i][k], minsum[j-(1<<k)+1][k]);
}
int main()
{
int n, m;
cin >> n >> m;
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
init_RMQ(n);
for(int i=0;i<m;i++) {
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",getMax(l, r)-getMin(l, r));
}
}