아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

버거운 버거

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

요약
괄호 문자열에 구간 뒤집기 갱신이 가해질 때, 각 질의 구간을 올바른 괄호열로 만들기 위해 넣어야 하는 최소 문자 수를 구한다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 문자열 매칭, 구현, 스택
정답자
아직 제출이 없습니다

문제

키파는 버거운 직장을 그만두고 새 일을 시작하려고 햄버거집을 열었다. 케이크를 여러 번 만들면서 빵을 구워 본 적은 있지만 햄버거는 처음 만들어 봤기 때문에, 위아래 구분이 있는 빵을 알맞게 구워 햄버거 패티와 함께 탄수화물 폭탄인 버거운 버거를 만들어 팔기로 했다.

burgerish-burger

버거운 버거의 예시.

버거운 버거의 엄밀한 정의는 다음과 같다.

  • 속이 위로 온 빵 X 위에 속이 아래로 온 빵 Y를 올린 것은 버거운 버거이다. 이때 X를 Y의 대응하는 쌍, Y를 X의 대응하는 쌍이라 한다.
  • 속이 위로 온 빵 X 위에 버거운 버거를 올리고 그 위에 속이 아래로 온 빵 Y를 올린 것은 버거운 버거이다. 마찬가지로 이때 X를 Y의 대응하는 쌍, Y를 X의 대응하는 쌍이라 한다.
  • 버거운 버거 위에 버거운 버거를 올린 것은 버거운 버거이다.
  • 위 세 규칙으로 만들 수 없는 것은 버거운 버거가 아니다.

키파는 빵 굽는 기계 N개를 일렬로 세워 두고 동시에 다루고 있다. 기계 하나는 빵을 하나만 구울 수 있다. 가장 왼쪽 기계부터 오른쪽으로 1부터 번호를 붙이자. 키파가 가게를 운영하는 동안 다음 두 가지 상황 중 하나가 Q번 발생할 수 있다.

  • a번 기계부터 b번 기계까지의 빵이 곧 타려고 하기 때문에 각각 뒤집어 줘야 한다.
  • 손님이 a번 기계부터 b번 기계까지의 빵을 차곡차곡 쌓아 주기를 원한다. 즉, 이 과정에서 빵을 뒤집어 쌓으면 안 되고, 가장 아래에 a번 기계에서 나온 빵, 그 위에 (a+1)번 기계에서 나온 빵, 이런 식으로 가장 위에 b번 기계에서 나온 빵이 순서대로 쌓여야 한다. 키파는 기계에 빵이 없으면 재료가 다 떨어진 것처럼 보인다고 생각했기 때문에, 한 주문이 끝난 뒤에는 그 주문을 받기 이전 상태대로 빵의 위아래를 맞춰 채워 둔다.

그런데 손님이 햄버거를 만들려고 빵을 쌓았을 때 어떤 빵은 대응하는 쌍이 존재하지 않아 버거운 버거로서 실격일 수 있다. 키파는 각 손님의 주문대로 빵을 쌓은 뒤, 이 빵을 버거운 버거로 만들기 위해 쌓아 둔 빵의 순서를 유지하면서 미리 구워 둔 빵을 최소한으로 집어넣고자 한다. 키파는 손님들의 건강에 관심이 많기 때문에 각 주문마다 버거운 버거의 높이, 즉 버거운 버거에 들어간 빵의 개수를 알고자 한다. 이를 구하는 프로그램을 작성해 키파를 도와주자.

입력

첫 줄에 양의 정수 N이 주어진다.

둘째 줄에 길이가 N이고 (와 )로만 구성된 문자열이 주어진다. 모든 1 ≤ i ≤ N에 대해 i번째 문자가 (이면 속이 위로 온 빵이 i번 기계에, )이면 속이 아래로 온 빵이 i번 기계에 들어 있다는 뜻이다.

셋째 줄에 양의 정수 Q가 주어진다.

넷째 줄부터 Q개의 줄에 세 개의 양의 정수 t, a, b로 상황이 주어진다. t는 2 이하이며, 1 ≤ a ≤ b ≤ N이다.

t = 1인 경우 a번 기계부터 b번 기계까지의 빵을 뒤집어 줘야 함을 뜻한다.

t = 2인 경우 a번 기계부터 b번 기계까지의 빵을 꺼내 버거운 버거로 만들어 달라는 주문이 들어왔음을 뜻한다.

출력

각 주문(t = 2)마다 버거운 버거의 높이를 한 줄에 하나씩 출력한다.

제한

  • 1 ≤ N ≤ 1,000,000
  • 1 ≤ Q ≤ 300,000

예제1

  1. 예제 1

    입력
    4
    (()(
    5
    1 2 3
    2 1 4
    1 1 4
    1 2 2
    2 3 4
    
    예상 출력
    6
    4