만드는 중입니다

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

동적 사이클 계산 쿼리

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

요약
간선을 추가하고 삭제하는 무방향 다중 그래프에서 두 간선이 정확히 같은 단순 사이클에 속하는지 판별합니다.
난이도

어려움10점 중 9점

유형
그래프, 유니온 파인드, 분할 정복, DFS
정답자
아직 제출이 없습니다

문제

자기 루프(self loop)가 없는 무방향 그래프의 간선 ee에 대해, ee를 포함하는 모든 간선 단순 사이클의 집합을 C(e)C(e)라고 하자. 간선 단순 사이클은 한 정점에서 출발해 같은 정점으로 돌아오는 경로이다. 간선을 1개 이상 가지며, 같은 간선을 두 번 이상 지나지 않는다. 정의에 따라 단순 사이클에는 서로 다른 정점이 2개 이상 포함된다. 시작 정점 이외의 정점을 두 번 이상 지나는 것은 허용된다.

정점 nn개와 간선 mm개를 가지고, 자기 루프가 없는 그래프 GG가 주어진다. 정점은 1부터 nn까지 서로 다른 번호가, 간선은 1부터 mm까지 서로 다른 번호가 붙어 있다. eie_i는 번호가 ii인 간선이다. 같은 두 정점을 잇는 간선이 여러 개 있을 수 있다.

다음 쿼리에 답하라.

  • 1 i j: eie_i와 eje_j를 각각 번호 ii, jj인 간선이라고 하자. C(ei)=C(ej)C(e_i) = C(e_j)이면 "1", 아니면 "0"을 출력한다. 두 간선 모두 이미 제거된 간선이 아님이 보장된다.
  • 2 a b c d: 가장 최근에 출력한 1번 쿼리의 답이 "1"이면 정점 aa와 bb를 잇는 간선을, "0"이면 정점 cc와 dd를 잇는 간선을 추가한다. 이 쿼리가 kk번째 2번 쿼리라면, 추가된 간선의 번호는 m+km+k이다.
  • 3 i j: 가장 최근에 출력한 1번 쿼리의 답이 "1"이면 eie_i를, "0"이면 eje_j를 그래프에서 제거한다. 두 간선 모두 이미 제거된 간선이 아님이 보장된다.

첫 쿼리는 항상 1번 쿼리이다. 초기 간선과 2번 쿼리로 추가되는 간선은 모두 서로 다른 두 정점을 잇는다.

입력

첫 줄에 테스트 케이스의 개수 TT (1≤T≤361 \le T \le 36)가 주어진다. 각 테스트 케이스의 첫 줄에는 정수 nn, mm, qq가 주어진다 (2≤n≤500002 \le n \le 50000, 1≤m,q≤500001 \le m, q \le 50000). 이어서 mm개의 줄에 초기 간선의 두 끝점 uu, vv가 주어진다 (1≤u,v≤n1 \le u, v \le n, u≠vu \neq v). 그다음 qq개의 줄에 위에서 설명한 형식의 쿼리가 주어진다.

모든 테스트 케이스에 대해 n+m+qn+m+q의 합은 30000003000000을 넘지 않는다.

출력

각 테스트 케이스마다 "Case #C"를 한 줄에 출력한다. 여기서 CC는 테스트 케이스 번호이다. 다음 줄에는 1번 쿼리의 답을 입력 순서대로 공백 없이 이어 붙여 출력한다.

예제1

  1. 예제 1

    입력
    2
    5 3 5
    5 3
    5 2
    5 1
    1 1 3
    2 1 2 2 3
    1 4 1
    1 4 2
    1 4 3
    5 5 9
    1 2
    2 3
    3 4
    4 5
    5 1
    1 1 5
    3 1 5
    1 2 5
    3 3 5
    2 1 4 3 4
    1 2 6
    3 2 6
    2 3 4 3 4
    1 4 7
    
    예상 출력
    Case #1
    1011
    Case #2
    1101