线段树查询模板(POJ 3264)
C++ code:
#include <iostream> #include <cstdio> using namespace std; struct heights { long tallest, shortest; }T[131072], Ans; int main() { long N, Q, n, M, i, height, A, B; while(scanf("%ld%ld", &N, &Q) != -1) { n = N + 1; M = 1; while(n) { n >>= 1; M <<= 1; } for(i = 0; i <= M - 1; i++) { if(i >= 1 && i <= N) { scanf("%ld", &height); T[M + i].tallest = T[M + i].shortest = height; } else { T[M + i].tallest = 0; T[M + i].shortest = 1000001; } } n = M >> 1; while(n) { for(i = n; i <= (n << 1) - 1; i++) { T[i].tallest = T[i << 1].tallest > T[(i << 1) + 1].tallest ? T[i << 1].tallest : T[(i << 1) + 1].tallest; T[i].shortest = T[i << 1].shortest > T[(i << 1) + 1].shortest ? T[(i << 1) + 1].shortest : T[i << 1].shortest; } n >>= 1; } for(i = 1; i <= Q; i++) { Ans.tallest = 0; Ans.shortest = 1000001; scanf("%ld%ld", &A, &B); for(A += M - 1, B += M + 1; A ^ B ^ 1; A >>= 1, B >>= 1) { if(~A & 1) { if(Ans.tallest < T[A ^ 1].tallest) Ans.tallest = T[A ^ 1].tallest; if(Ans.shortest > T[A ^ 1].shortest) Ans.shortest = T[A ^ 1].shortest; } if(B & 1) { if(Ans.tallest < T[B ^ 1].tallest) Ans.tallest = T[B ^ 1].tallest; if(Ans.shortest > T[B ^ 1].shortest) Ans.shortest = T[B ^ 1].shortest; } } printf("%ld\n", Ans.tallest - Ans.shortest); } } return 0; }