题目链接:POJ 3264
题意:RMQ问题
题解:采用非递归线段树,orz神牛真是太强了,这种线段树好理解, 我成功1A,本蒻苣简直不敢相信....
上代码:
//lrl's submission
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<vector>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
#define debug 0
#define inf 0x3f3f3f3f
#define M(a, b) memset(a, b, sizeof(a))
const int maxn = 50000 + 5;
int l[maxn << 2],r[maxn << 2], a, b; //四倍空间
int n, queryNum,M;
void build(){
for(M = 1; M <= n + 1; M *= 2);
for(int i = M + 1; i <= M + n; i++)
{
scanf("%d", &l[i]); //初始化
r[i] = l[i];
}
for(int i = M - 1; i >= 1; i--)
{
l[i] = min(l[i << 1], l[i << 1 | 1]); //处理
r[i] = max(r[i << 1], r[i << 1 | 1]);
}
}
void query(){
scanf("%d%d", &a, &b);
a += M - 1; //开区间
b += M + 1;
int maxAns = -inf, minAns = inf, ans;
if(a == b)
ans = 0;
else{
while(b - a > 1){
if(a % 2 == 0){ //操作
minAns = min(minAns, l[a + 1]);
maxAns = max(maxAns, r[a + 1]);
}
if(b % 2){
minAns = min(minAns, l[b - 1]);
maxAns = max(maxAns, r[b - 1]);
}
a >>= 1;
b >>= 1;
}
ans = maxAns - minAns;
}
printf("%d\n", ans);
}
int main(){
#if debug
freopen("in.txt", "r", stdin);
#endif // debug
while(~scanf("%d%d", &n, &queryNum)){
M(l, inf);
M(r, -inf);
build();
while(queryNum--){
query();
}
}
return 0;
}