結果
問題 | No.1778 括弧列クエリ / Bracketed Sequence Query |
ユーザー |
|
提出日時 | 2025-03-21 08:03:55 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,828 ms / 2,000 ms |
コード長 | 1,332 bytes |
コンパイル時間 | 724 ms |
コンパイル使用メモリ | 82,688 KB |
実行使用メモリ | 288,272 KB |
最終ジャッジ日時 | 2025-03-21 08:04:29 |
合計ジャッジ時間 | 30,074 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 27 |
ソースコード
import sys sys.setrecursionlimit(10**6) N,Q = map(int,input().split()) S = [0]+list(input()) V = N//2 K = 0 while 2**K<V: K += 1 dp = [[0 for _ in range(K+1)] for _ in range(V+1)] T = [[] for _ in range(V+1)] dist = [0]*(N+1) ind = 0 T[0].append(0) ind += 1 indv= 0 def dfs(v): global ind,indv if S[ind]=="(": indv += 1 dp[indv][0] = v dist[indv] = dist[v]+1 T[indv].append(ind) ind += 1 if ind>N:return dfs(indv) else: u = dp[v][0] T[v].append(ind) ind += 1 if ind>N:return dfs(u) dfs(0) T[0].append(ind) invT = [0]*(N+2) for v in range(V+1): i0,i1 = T[v] invT[i0] = v invT[i1] = v for k in range(1,K+1): for i in range(1,V+1): dp[i][k] = dp[dp[i][k-1]][k-1] def lca(u,v): if dist[u]>dist[v]: u,v = v,u for k in range(K,-1,-1): if (dist[v]-dist[u])>>k & 1: v = dp[v][k] if u==v: return u for k in range(K,-1,-1): if dp[u][k]!=dp[v][k]: u = dp[u][k] v = dp[v][k] return dp[u][0] for _ in range(Q): x,y = map(int,input().split()) u = invT[x] v = invT[y] if u==v: print(*T[u]) else: a = lca(u,v) if a==0: print(-1) else: print(*T[a])