rt,把数据下载下来看了一下,发现对于有些询问输出0
样例能过
大佬们能帮我审一下代码吗?希望是些睿智错误
#include <bits/stdc++.h>
using namespace std;
#define MAXN 50005
#define INF 1000000000000LL
typedef long long ll;
ll n,q,a[MAXN],tree_max[MAXN*4],tree_min[MAXN*4];
void build(ll rt,ll l,ll r){
if(l==r){
tree_max[rt]=tree_min[rt]=a[l];
}else{
ll mid=(l+r)/2;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
tree_max[rt]=max(tree_max[rt*2],tree_max[rt*2+1]);
tree_min[rt]=min(tree_min[rt*2],tree_min[rt*2+1]);
}
}
ll query_max(ll rt,ll l,ll r,ll L,ll R){
if(L<=l&&R>=r){
return tree_max[rt];
}else{
ll mid=(l+r)/2,ret=0;
if(L<=mid){
ret=max(ret,query_max(rt*2,l,mid,L,R));
}else if(R>mid){
ret=max(ret,query_max(rt*2+1,mid+1,r,L,R));
}
return ret;
}
}
ll query_min(ll rt,ll l,ll r,ll L,ll R){
if(L<=l&&R>=r){
return tree_min[rt];
}else{
ll mid=(l+r)/2,ret=INF;
if(L<=mid){
ret=min(ret,query_min(rt*2,l,mid,L,R));
}else if(R>mid){
ret=min(ret,query_min(rt*2+1,mid+1,r,L,R));
}
return ret;
}
}
int main(){
scanf("%lld%lld",&n,&q);
for(ll i=1;i<=n;i++){
scanf("%lld",a+i);
}
build(1,1,n);
for(ll i=1;i<=q;i++){
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",query_max(1,1,n,l,r)-query_min(1,1,n,l,r));
}
return 0;
}
数据#2前50行输出结果:
0
0
0
637497
0
0
0
0
854711
0
94741
0
0
0
246772
0
0
0
0
0
936515
897022
984031
0
0
0
0
823421
847236
0
859753
0
0
0
0
0
0
0
0
946582
0
891211
0
0
157160
0
0
333444
0
0
我太弱了qwq