問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
(はじめに)
問題 5,6 でSegment Treeの更新についてやってきました。
最後に、問題 7,8,9 を通してSegment Treeを用いて区間クエリ(ここでは区間max)を処理していきます。
class SegTree():
def calc(self,a, b): #行いたい処理
return max(a, b)
def e(self): #単位元
return 0
def __init__(self, n, A):
#完全2分木を作る
#N = 2 ** k ≧ n となるようにする。(葉の数がnより多くなるようにする。)
self.k = (n - 1).bit_length() #bit_lengthメソッドにより取得が出来る。
N = 2 ** (self.k)
self.N = N
self.Tree = [self.e()] * (2 * N - 1)
#葉の部分に初期要素を入れる
for i in range(n):
self.Tree[N - 1 + i] = A[i]
#葉から近い順にそれぞれの葉以外の頂点の計算を行う
for i in range(N - 2, -1, -1):
self.Tree[i] = self.calc(self.Tree[2 * i + 1], self.Tree[2 * i + 2]) #頂点iの子は2i+1,2i+2、そこの2つを用いて計算を行う
def renewal(self, ind, x): #A[ind]をxに更新
T = self.N - 1 + ind #A[ind]に対応する場所
self.Tree[T] = x
while T > 0: #根にたどるまで更新を続ける
T = (T - 1) // 2
self.Tree[T] = self.calc(self.Tree[2 * T + 1], self.Tree[2 * T + 2])
def product(self, l, r): #A[l]からA[r]までの計算結果を返す
#問題 7,8,9 で実装

入力は以下のフォーマットで与えられます。
Q
k_1 p_1 l_1
k_2 p_2 l_2
...
k_Q p_Q l_Q
答えを Q 行で出力してください。
i (1 ≦ i ≦ Q) 行目には、i番目のクエリの答えを出力してください。
すべてのテストケースについて以下の条件を満たします。
15
3 0 3
3 0 2
3 4 2
3 0 1
3 2 1
3 4 1
3 6 1
3 0 0
3 1 0
3 2 0
3 3 0
3 4 0
3 5 0
3 6 0
3 7 0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5
1 1 0
5 4 1
2 3 0
5 8 3
6 0 6
2
17
6
4
0