题意:
给一个数组,每次询问一个区间,输出区间内最大值和最小值的差。
思路:维护一个区间最小值,一个区间最大值
Code:
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=50007;
inline ll read() {
ll s = 0, w = 1;
char ch = getchar();
while (ch < 48 || ch > 57) {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= 48 && ch <= 57)
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
int mx[maxn<<2],mn[maxn<<2];
inline void build(int l,int r,int rt) {
if(l==r) {
mx[rt]=mn[rt]=read();
return;
}
int mid=l+r>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
mn[rt]=min(mn[rt<<1],mn[rt<<1|1]);
}
inline int query(int x,int y,int l,int r,int rt) {
if(x<=l&&r<=y) return mx[rt];
int mid=l+r>>1,a=0,b=0;
if(x<=mid) a=query(x,y,l,mid,rt<<1);
if(y>mid) b=query(x,y,mid+1,r,rt<<1|1);
return max(a,b);
}
inline int query2(int x,int y,int l,int r,int rt) {
if(x<=l&&r<=y) return mn[rt];
int mid=l+r>>1,a=0x3f3f3f3f,b=0x3f3f3f3f;
if(x<=mid) a=query2(x,y,l,mid,rt<<1);
if(y>mid) b=query2(x,y,mid+1,r,rt<<1|1);
return min(a,b);
}
int main() {
int n=read(),q=read(),x,y;
build(1,n,1);
while(q--) {
x=read(),y=read();
printf("%d\n",query(x,y,1,n,1)-query2(x,y,1,n,1));
}
return 0;
} 
京公网安备 11010502036488号