文章目录
- Question
- Ideas
- Code
Question
输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y 这段区间内的最大数。
输入格式
第一行两个整数 N,M 表示数字的个数和要询问的次数;
接下来一行为 N 个数;
接下来 M 行,每行都有两个整数 X,Y。
输出格式
输出共 M 行,每行输出一个数。
数据范围
1≤N≤105,
1≤M≤106,
1≤X≤Y≤N,
数列中的数字均不超过231−1
输入样例:
10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8
输出样例:
5
8
Ideas
线段树求连续区间最大值
Code
class Node:
def __init__(self):
self.l, self.r, self.m = 0, 0, 0
def pushup(u):
tr[u].m = max(tr[u<<1].m,tr[u<< 1 | 1].m)
# 初始化线段树 u代表根节点下标,1
def build(u, l, r):
if l == r:
tr[u].l, tr[u].r, tr[u].m = l, r, lis[r]
else:
tr[u].l, tr[u].r = l, r
mid = l + r >> 1
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r)
tr[u].m = max(tr[u<<1].m,tr[u<< 1 | 1].m)
pushup(u)
# 求[l,r]最大值 u代表根节点下标,1
def query(u, l, r):
if tr[u].l >= l and tr[u].r <= r:
return tr[u].m
mid = tr[u].l + tr[u].r >> 1
max_v = -float('inf')
if l <= mid: max_v = query(u << 1, l, r)
if r > mid: max_v = max(max_v ,query(u << 1 | 1, l, r))
return max_v
n, m = map(int, input().split())
lis = [0] + list(map(int, input().split()))
tr = [Node() for i in range(4*n)]
build(1, 1, n)
for _ in range(m):
a, b = map(int, input().split())
print(query(1,a,b))