线段树查询模板(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;
}

浙公网安备 33010602011771号