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

}

你可能感兴趣的:(poj)