結果
| 問題 |
No.878 Range High-Element Query
|
| コンテスト | |
| ユーザー |
nagiss
|
| 提出日時 | 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)))
nagiss