文章目录
- 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))                
                










