线段树查询模板(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;
}
posted @ 2011-07-14 15:01  zxfx100  阅读(198)  评论(0编辑  收藏  举报