만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

버스 기사 집합지

시간 제한6초메모리 제한512 MB

요약
버스 기사 집합 N개에 대해 구간 갱신과 교환 연산을 처리하고, 구간 안의 우수 집합 또는 열등 집합에 속한 기사 기량을 출력합니다.
난이도

어려움10점 중 9점

유형
세그먼트 트리, 비트 연산, 구현
정답자
아직 제출이 없습니다

문제

진주 나들이를 온 보선이는 나들이를 끝내고 원래 살던 서울로 돌아가려고 진주 개양터미널에 도착했다. 그런데 무슨 일인가? 장난꾸러기 버스 기사분들이 전부 숨어버리거나 사라져버렸다. 숨은 장소 NN곳의 힌트만 남겨 놓은 채 말이다.

개양터미널 매표원 수현이는 난처해졌지만 잘생긴 얼굴 하나만 믿고, 보선이에게 버스 기사분들을 꼭 찾아서 각 버스에 배정해 달라고 부탁했다. 보선이는 '돌아가는 교통편을 무료로 이용할 수 있겠지?'라는 생각에 이 부탁을 들어주기로 했다. 동시에 자기가 타고 갈 버스에는 운전 실력이 가장 좋은 기사를 배정하겠다고 다짐했다.

버스 기사의 운전 실력은 00 이상 5050 이하의 정수이며, 수치가 높을수록 실력이 좋다. 버스 기사분들이 숨은 곳을 버스 기사 집합지라고 부르며, 총 NN곳이 있다.

구간 [A,B][A, B]가 주어졌을 때, 구간 안의 우수한 버스 기사 집합지는 다음과 같이 찾을 수 있다.

  1. AA번째 집합지부터 BB번째 집합지까지 중 운전 실력이 5050인 버스 기사가 있는 집합지를 모두 고른다. 그런 집합지가 없으면 AA번째부터 BB번째까지 모든 집합지를 고른다.
  2. 1번 과정에서 여러 곳을 골랐다면, 그중 운전 실력이 4949인 버스 기사가 있는 집합지를 고른다. 그런 집합지가 없으면 직전 과정에서 고른 곳 전체를 고른다.
  3. 운전 실력을 11씩 줄여 가며 2번 과정을 반복하여, 집합지가 하나만 남을 때까지 계속한다. 운전 실력이 음수가 되면 직전 과정에서 고른 곳 전체를 고르고 멈춘다. 따라서 우수한 버스 기사 집합지는 여러 곳일 수 있다.

구간 [A,B][A, B]의 저조한 버스 기사 집합지도 같은 방법으로 찾는다. 다만 각 단계에서 해당 운전 실력의 기사가 있는 집합지 대신 없는 집합지를 고른다. 따라서 구간 [A,B][A, B] 안의 우수한 버스 기사 집합지와 저조한 버스 기사 집합지가 같을 수도 있다.

보선이는 일이 수월할 것이라고 믿었지만, 장난꾸러기 기사분들은 한 곳에 가만히 있지 않는다. 갑자기 알 수 없는 곳으로 사라지기도 하고, 갑자기 나타나기도 하며, 다른 집합지로 옮겨 가기도 한다. 다행히 개양터미널의 정보원 우근이 덕분에 이동 정보를 쉽게 알 수 있었지만, 보선이는 점점 귀찮아져서 우리에게 대신 처리해 달라고 부탁했다.

이동 정보의 개수와 우수한 버스 기사 집합지, 저조한 버스 기사 집합지를 알아내야 하는 횟수, 즉 모든 쿼리의 개수는 총 QQ개다. 이를 우리가 대신 처리해 보자.

입력

첫 번째 줄에 버스 기사 집합지의 개수 NN이 주어진다. (1≤N≤200 0001 \le N \le 200\,000)

두 번째 줄부터 NN개의 줄에 걸쳐 ii번째 집합지에 있는 버스 기사의 수 MiM_i와 버스 기사의 운전 실력 L1,…,LMiL_1, \dots, L_{M_i}가 공백으로 구분되어 주어진다. 각 줄에 주어지는 LjL_j는 서로 중복되지 않는다. (1≤Mi≤501 \le M_i \le 50; 0≤Lj≤500 \le L_j \le 50)

N+2N+2번째 줄에는 쿼리의 개수 QQ가 주어진다. (1≤Q≤200 0001 \le Q \le 200\,000)

N+3N+3번째 줄부터 QQ개의 줄에 걸쳐 쿼리가 한 줄에 하나씩 주어진다. 각 쿼리는 다음과 같다.

  • 11 AA BB MM L1L_1 …\dots LML_M: A≤i≤BA \le i \le B인 모든 ii번째 집합지에 운전 실력이 L1,…,LML_1, \dots, L_M인 버스 기사를 각각 1명씩, 총 MM명 추가한다. 주어지는 LjL_j는 서로 중복되지 않는다. (1≤A≤B≤N1 \le A \le B \le N; 1≤M≤501 \le M \le 50; 0≤Lj≤500 \le L_j \le 50)
  • 22 AA BB MM L1L_1 …\dots LML_M: A≤i≤BA \le i \le B인 모든 ii번째 집합지에서 L1,…,LML_1, \dots, L_M 중 어느 값과도 운전 실력이 같지 않은 버스 기사는 모두 사라진다. 주어지는 LjL_j는 서로 중복되지 않는다. (1≤A≤B≤N1 \le A \le B \le N; 1≤M≤501 \le M \le 50; 0≤Lj≤500 \le L_j \le 50)
  • 33 AA MM L1L_1 …\dots LML_M: AA번째 집합지에서 L1,…,LML_1, \dots, L_M 중 어느 값과도 운전 실력이 같지 않은 버스 기사는 모두 사라진다. 그다음 각 LiL_i에 대해, AA번째 집합지에 운전 실력이 LiL_i인 버스 기사가 없다면 그 기사를 1명씩 추가한다. 주어지는 LiL_i는 서로 중복되지 않는다. (1≤A≤N1 \le A \le N; 1≤M≤501 \le M \le 50; 0≤Li≤500 \le L_i \le 50)
  • 44 AA BB: AA번째 집합지의 버스 기사는 모두 BB번째 집합지로 가고, BB번째 집합지의 버스 기사는 모두 AA번째 집합지로 간다. 즉, 두 집합지의 버스 기사 상태가 서로 바뀐다. (1≤A≤B≤N1 \le A \le B \le N)
  • 55 AA BB: 구간 [A,B][A, B] 안의 저조한 버스 기사 집합지에 있는 모든 버스 기사의 운전 실력을 중복을 제외하고 오름차순으로 출력한다. 그런 기사가 없으면 -1을 출력한다. (1≤A≤B≤N1 \le A \le B \le N)
  • 66 AA BB: 구간 [A,B][A, B] 안의 우수한 버스 기사 집합지에 있는 모든 버스 기사의 운전 실력을 중복을 제외하고 오름차순으로 출력한다. 그런 기사가 없으면 -1을 출력한다. (1≤A≤B≤N1 \le A \le B \le N)
  • 77 AA BB: 구간 [A,B][A, B] 안의 저조한 버스 기사 집합지가 구간 [A,B][A, B] 안의 우수한 버스 기사 집합지가 되려면 최소 인원만큼 추가해야 하는 버스 기사의 운전 실력을 오름차순으로 출력한다. 단, 추가하는 버스 기사의 운전 실력은 구간 [A,B][A, B] 안의 우수한 버스 기사 집합지에 있는 기사의 운전 실력이어야 한다. 기사를 추가하지 않아도 우수한 버스 기사 집합지가 될 수 있다면 -1을 출력한다. (1≤A≤B≤N1 \le A \le B \le N)

모든 쿼리는 주어진 순서대로 하나씩 처리하며, 출력을 요구하는 쿼리는 한 번 이상 주어진다. 입력으로 주어지는 모든 수는 정수이다.

출력

5, 6, 7번 쿼리에 대해 알맞은 답을 한 줄에 하나씩 출력한다.

힌트

Python 3 사용자는 PyPy3로 제출하는 것을 권장한다.

예제1

  1. 예제 1

    입력
    4
    1 0
    1 1
    1 2
    1 3
    8
    5 1 4
    1 1 3 2 1 4
    6 1 4
    2 3 4 1 3
    7 1 4
    3 1 3 1 4 5
    4 2 4
    7 1 2
    
    예상 출력
    0
    1 2 4
    0 1 4
    4 5