题目大致是说给出q个询问,每次询问一段区间中最大值和最小值的差。
然后我这个线段树不知道为什么输入的区间是2 2的时候它的输出区间是2 3……
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
const int MAXN=50005;
struct Tree{int l,r,mx,mn;}t[MAXN*4];
int a[MAXN],n,q;
void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
if(t[p].l==t[p].r){
t[p].mx=a[l],t[p].mn=a[l];
return;
}
int mid=l+r>>1;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
t[p].mx=max(t[p*2].mx,t[p*2+1].mx);
t[p].mn=min(t[p*2].mn,t[p*2+1].mn);
}
int askmx(int l,int r,int p){
if(l<=t[p].l&&r>=t[p].r)return t[p].mx;
int mid=t[p].l+t[p].r>>1;
int mx=-(1<<20);
if(l<=mid)mx=max(mx,askmx(l,mid,p*2));
if(r>mid)mx=max(mx,askmx(mid+1,r,p*2+1));
return mx;
}
int askmn(int l,int r,int p){
if(l<=t[p].l&&r>=t[p].r)return t[p].mn;
int mid=t[p].l+t[p].r>>1;
int mn=1<<20;
if(l<=mid)mn=min(mn,askmn(l,mid,p*2));
if(r>mid)mn=min(mn,askmn(mid+1,r,p*2+1));
return mn;
}
int main(){
n=read(),q=read();
for(register int i=1;i<=n;i++)a[i]=read();
build(1,n,1);
while(q--){
int l=read(),r=read();
printf("%d\n",askmx(l,r,1)-askmn(l,r,1));
}
return 0;
}
这里有张图
注意到我这个程序输入2 2的时候给输出的是2 3得结果,但是我查不出来哪里错了,所以各位能帮忙查一下错吗……