AcWing 1273. 天才的记忆 RMQ版本
原题链接
简单
作者:
皓首不倦
,
2020-09-16 11:22:32
,
所有人可见
,
阅读 440
'''
RMQ静态解法
'''
import math
class RMQ:
# is_max标记为True时候求最大值,反之求最小值
def __init__(self, data, is_max=True):
self.__data = data
self.__is_max = is_max
self.__build()
def __build(self):
d = self.__data
n = len(d)
op = max if self.__is_max else min
max_pow = int(math.log2(n))
# dp(i, j)表示从i位置开始,长度为2^j的区间中的最大值
self.__dp = [[None] * (max_pow + 1) for _ in range(n)]
for i in range(n - 1, -1, -1):
for j in range(max_pow + 1):
if j == 0:
self.__dp[i][j] = d[i]
else:
if i + (1 << j) - 1 >= n:
break
self.__dp[i][j] = op(self.__dp[i][j - 1], self.__dp[i + (1 << (j - 1))][j - 1])
# 查询闭区间[L, R]中的极值, 下标从0开始
def get_range_val(self, L, R):
op = max if self.__is_max else min
max_pow = int(math.log2(R - L + 1))
return op(self.__dp[L][max_pow], self.__dp[R - (1 << max_pow) + 1][max_pow])
n = int(input())
vals = list(map(int, input().split()))
rmq = RMQ(vals)
m = int(input())
for _ in range(m):
a, b = map(int, input().split())
a, b = a - 1, b - 1
print(rmq.get_range_val(a, b))