올바른 괄호 문자열과 쿼리

시간 제한2초메모리 제한1024 MB

요약
`(`, `)`, `*`로 이루어진 문자열에서 한 글자를 바꾸는 갱신과, 구간의 `*`를 임의로 바꾸거나 지워 올바른 괄호 문자열을 만들 수 있는지 묻는 쿼리를 처리합니다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 문자열, 그리디, 누적 합
정답자
아직 제출이 없습니다

문제

이 문제는 출제자가 어떤 온라인 저지의 어떤 문제를 보고 영감이 떠올라 내용째로 가져와 약간만 수정한 문제입니다.

올바른 괄호 문자열은 다음과 같이 정의된 문자열의 특성입니다.

  • 빈 문자열 ∅\varnothing은 올바른 괄호 문자열입니다.
  • A\mathbf{A}가 올바른 괄호 문자열이라면, A\mathbf{A}를 괄호로 둘러싼 (A)\mathtt{\color{#e74c3c}{(}} \mathbf{A} \mathtt{\color{#e74c3c}{)}} 또한 올바른 괄호 문자열입니다.
  • A\mathbf{A}와 B\mathbf{B}가 올바른 괄호 문자열이라면, A\mathbf{A}와 B\mathbf{B}를 붙인 AB\mathbf{A} \mathbf{B} 또한 올바른 괄호 문자열입니다.

길이가 nn이며 '(', ')', '*'로만 이루어진 문자열 SS가 주어집니다. 여러분은 다음과 같은 쿼리 qq개를 해결해야 합니다.

  • 1 i,,ci \\,\\, c: SS의 ii번째 문자를 cc로 바꿉니다. cc는 '(', ')', '*' 중 하나입니다. (1≤i≤n1 \le i \le n)
  • 2 l,,rl \\,\\, r: SS의 부분 문자열 S_lS_l+1⋯S_r−1S_rS\_lS\_{l+1}\cdots S\_{r-1}S\_r에서 등장하는 '*'를 각각 임의로 '(', ')', 또는 빈 문자열 ∅\varnothing로 바꾼 뒤, ∅\varnothing으로 바꾼 부분을 제외하고 모두 원래 순서대로 이어붙여 올바른 괄호 문자열을 만들 수 있는지 구합니다. (1≤l≤r≤n1 \le l \le r \le n)

과연 여러분은 충분히 빠르게 모든 쿼리를 해결할 수 있을까요?

입력

첫 번째 줄에 문자열 SS의 길이 nn과 쿼리의 수 qq가 공백으로 구분되어 주어집니다. (1≤n,q≤3⋅1051 \le n,q \le 3\cdot 10^5)

두 번째 줄에 길이 nn의 문자열 SS가 주어집니다. SS의 모든 문자는 '(', ')', '*' 중 하나입니다.

그다음 줄부터 qq개의 줄에 걸쳐 각 줄에 쿼리가 하나씩 주어집니다. 각 쿼리는 지문에서 주어진 종류 중 하나입니다.

출력

2번 쿼리가 입력될 때마다, 올바른 괄호 문자열을 만들 수 있다면 'Yes'를, 아니면 'No'를 새로운 줄에 출력합니다.

예제1

  1. 예제 1

    입력
    12 13
    (*)())()((*)
    2 1 12
    2 1 3
    2 1 6
    2 9 12
    2 9 11
    1 2 )
    2 1 3
    2 1 2
    2 1 6
    1 3 *
    2 1 12
    1 11 (
    2 1 12
    
    예상 출력
    Yes
    Yes
    Yes
    Yes
    No
    No
    Yes
    No
    Yes
    No