1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
def build(o,l,r):
if l==r:
t[o] = A[l]
return
m = (l+r)//2
build(o*2,l,m)
build(o*2+1,m+1,r)
t[o] = max(t[o*2],t[o*2+1])
def do(o,x): # 收到更新信息 x 后,树节点和懒标记的具体操作
t[o] = max(t[o],x)
f[o] = max(f[o],x)
def down(o):
if f[o]:
do(o*2,f[o])
do(o*2+1,f[o])
f[o] = 0
def update(a,b,x,o,l,r):
if a<=l and r<=b:
do(o,x)
return
m = (l+r)//2
down(o)
if a<=m: update(a,b,x,o*2,l,m)
if m<b: update(a,b,x,o*2+1,m+1,r)
t[o] = max(t[o*2],t[o*2+1])
def query(a,b,o,l,r):
if a<=l and r<=b:
return t[o]
m = (l+r)//2
down(o)
res = 0
if a<=m: res = query(a,b,o*2,l,m)
if m<b: res = max(res,query(a,b,o*2+1,m+1,r))
return res
t = [0]*n*4 # 树节点,维护区间信息
f = [0]*n*4 # 懒标记,注意让初始值代表无标记
|