注意别把mid定义为全局变量,不然递归函数的时候会改变mid的值,导致find函数写错了
改好的程序:
```cpp
#include<bits/stdc++.h>
using namespace std;
long long n,m,b,ans,mid;
long long c[500005];
long long a[500005];
long long xi[500005];
long long yi[500005];
int build(int l,int r,int s){
if(l==r){
a[s]=c[l];
return 0;
}
mid=(l+r)/2;
build(l,mid,s*2);
mid=(l+r)/2;
build(mid+1,r,s*2+1);
a[s]=min(a[s*2],a[s*2+1]);
return 0;
}
int find(int x,int y,int l,int r,int s){
if(x<=l&&y>=r){
ans=min(ans,a[s]);
return 0;
}
if(y>=l&&x<=l||x<=r&&y>=r||x>=l&&y<=r){
mid=(l+r)/2;
find(x,y,l,mid,s*2);
mid=(l+r)/2;
find(x,y,mid+1,r,s*2+1);
}
return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
cin>>c[i];
}
build(1,n,1);
for(int i=1;i<=m;i++){
scanf("%d%d",&xi[i],&yi[i]);
ans=2147483647;
find(xi[i],yi[i],1,n,1);
cout<<ans<<" ";
}
return 0;
}
```
by syp11 @ 2024-01-24 00:26:07
@[shiyupeng](/user/957501) 谢谢
by felixabc @ 2024-01-24 09:43:11