結果
問題 |
No.878 Range High-Element Query
|
ユーザー |
![]() |
提出日時 | 2019-09-06 23:23:30 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 358 ms / 2,000 ms |
コード長 | 2,346 bytes |
コンパイル時間 | 390 ms |
コンパイル使用メモリ | 82,044 KB |
実行使用メモリ | 107,764 KB |
最終ジャッジ日時 | 2024-06-24 21:21:04 |
合計ジャッジ時間 | 4,681 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
class Lca: # 最近共通祖先 def __init__(self, E, root): import sys sys.setrecursionlimit(500000) self.root = root self.E = E # V<V> self.n = len(E) # 頂点数 self.logn = 1 # n < 1<<logn ぴったりはだめ while self.n >= (1<<self.logn): self.logn += 1 # parent[n][v] = ノード v から 1<<n 個親をたどったノード self.parent = [[-1]*self.n for _ in range(self.logn)] self.depth = [0] * self.n self.dfs(root, -1, 0) for k in range(self.logn-1): for v in range(self.n): p_ = self.parent[k][v] if p_ >= 0: self.parent[k+1][v] = self.parent[k][p_] def dfs(self, v, p, dep): # ノード番号、親のノード番号、深さ self.parent[0][v] = p self.depth[v] = dep for e in self.E[v]: if e != p: self.dfs(e, v, dep+1) def get(self, u, v): if self.depth[u] > self.depth[v]: u, v = v, u # self.depth[u] <= self.depth[v] dep_diff = self.depth[v]-self.depth[u] for k in range(self.logn): if dep_diff >> k & 1: v = self.parent[k][v] if u==v: return u for k in range(self.logn-1, -1, -1): if self.parent[k][u] != self.parent[k][v]: u = self.parent[k][u] v = self.parent[k][v] return self.parent[0][u] N, Q = map(int, input().split()) A = list(map(int, input().split())) E = [[] for _ in range(N+1)] st = [] # 中身は常に降順 for i, a in enumerate(A): while st: i_, a_ = st.pop() if a_ < a: E[i].append(i_) E[i_].append(i) else: st.append((i_, a_)) break st.append((i, a)) for s, a in st: E[N].append(s) E[s].append(N) lca = Lca(E, N) # parent[n][v] = ノード v から 1<<n 個親をたどったノード parent = lca.parent Ans = [] for _ in range(Q): _, l, r = map(int, input().split()) l -= 1 r -= 1 ans = 0 v = l for par in parent[::-1]: if par[v] <= r and par[v]!=-1: v = par[v] ans += 1 ans <<= 1 ans >>= 1 Ans.append(ans+1) print("\n".join(map(str, Ans)))