結果

問題 No.1778 括弧列クエリ / Bracketed Sequence Query
ユーザー Wizist
提出日時 2021-12-11 18:23:10
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,147 bytes
コンパイル時間 807 ms
コンパイル使用メモリ 82,432 KB
実行使用メモリ 93,952 KB
最終ジャッジ日時 2024-07-20 00:54:50
合計ジャッジ時間 28,582 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 21 TLE * 2 -- * 4
権限があれば一括ダウンロードができます

ソースコード

diff #

from bisect import bisect_left

def rmq_update(t, i, val, f=min):
	t[i + len(t) // 2] = val
	i = (i + len(t) // 2) // 2
	while i > 0:
		t[i] = f(t[i * 2], t[i * 2 + 1])
		i //= 2
def rmq_query(t, l, r, f=min, def_val=0x7fffffff):
	i, j, a, b = l + len(t) // 2, r + len(t) // 2, def_val, def_val
	while i < j:
		if i % 2 != 0: a = f(a, t[i]); i += 1
		if j % 2 != 0: j -= 1; b = f(b, t[j])
		i, j = i // 2, j // 2
	return f(a, b)

N, Q = map(int, input().split())
s = input().strip()
p = [0] * N
st = []
for i, x in enumerate(s):
	if x == '(':
		st.append(i)
	else:
		p[i] = st[-1]
		p[st[-1]] = i
		st.pop()
a = [(i, p[i]) for i, x in enumerate(s) if x == '(']
t1, t2 = [N] * (N * 2), [-1] * (N * 2)
for i, x in enumerate(p):
	rmq_update(t1, i, x, min)
	rmq_update(t2, i, x, max)

for _ in range(Q):
	x, y = map(int, input().split())
	x -= 1; y -= 1
	if x > y: x, y = y, x
	l = min(rmq_query(t1, x, y + 1, min, N), x)
	r = max(rmq_query(t2, x, y + 1, max, 0), y)
	i = bisect_left(a, (l, r))
	while i < len(a) and i >= 0:
		if a[i][0] <= l and a[i][1] >= r: break
		i -= 1
	if i < 0 or i >= len(a): print(-1)
	else: print(a[i][0] + 1, a[i][1] + 1)
0