题目:POJ3264、洛谷P2880。
题目大意:有一个序列,每次问你一个区间里最大值与最小值的差。
解题思路:此题是一道RMQ问题,然而我只会线段树啊!于是线段树乱搞。
然后发现又R又T结果是因为读入优化写错了~~~~(>_<)~~~~
C++ Code:
#include<cstdio>
#include<cctype>
using namespace std;
#define C c=getchar()
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))
inline int readint(){
char C;
bool b=false;
while(!isdigit(c))b=c=='-',C;
int p=0;
while(isdigit(c))p=((p<<3)+(p<<1)+(c^'0')),C;
return (b)?-p:p;
}
int n,q,L,R,Ansmin,Ansmax;
int Max[300005],Min[300005];
void bt(int l,int r,int o){
if(l==r){
Max[o]=Min[o]=readint();
return;
}
int mid=l+r>>1;
bt(l,mid,o<<1);
bt(mid+1,r,o<<1|1);
Max[o]=max(Max[o<<1],Max[o<<1|1]);
Min[o]=min(Min[o<<1],Min[o<<1|1]);
}
void query(int l,int r,int o){
if(L<=l&&r<=R){
Ansmax=max(Ansmax,Max[o]);
Ansmin=min(Ansmin,Min[o]);
return;
}
int mid=l+r>>1;
if(L<=mid)query(l,mid,o<<1);
if(mid<R)query(mid+1,r,o<<1|1);
}
int main(){
n=readint(),q=readint();
bt(1,n,1);
while(q--){
L=readint(),R=readint();
Ansmin=100000000;
Ansmax=-Ansmin;
query(1,n,1);
printf("%d\n",Ansmax-Ansmin);
}
return 0;
}