문제 136
동적 포리스트의 경로 합
$N$개의 정점으로 이루어진 포리스트가 있다. 정점의 번호는 $1$부터 $N$까지이며, 처음에는 간선이 없고 정점의 값은 모두 $0$이다. 각 연결 성분에는 루트가 하나씩 있다.
다음 $Q$개의 연산을 순서대로 처리해 보자. 연산에서 $u$와 $v$는 정점 번호, $z$는 정수이다.
- $\texttt{L}\ u\ v$: $u$가 속한 성분의 루트를 $u$로 바꾼다. 두 정점이 다른 성분에 속하면 간선 $uv$를 추가한다. 이때 합쳐진 성분의 루트는 연결 전 $v$가 속한 성분의 루트이다.
- $\texttt{C}\ u\ v$: $u$가 속한 성분의 루트를 $u$로 바꾼다. 간선 $uv$가 있으면 삭제하고, 나뉜 두 성분의 루트를 각각 $u$와 $v$로 정한다.
- $\texttt{B}\ u\ v$: 두 정점이 같은 성분에 속하는지 판별한다.
- $\texttt{S}\ u\ z$: 정점 $u$의 값을 $z$로 바꾼다.
- $\texttt{G}\ u$: 정점 $u$의 값을 구한다.
- $\texttt{R}\ u$: $u$가 속한 성분의 루트를 $u$로 바꾼다.
- $\texttt{F}\ u$: $u$가 속한 성분의 루트를 구한다.
- $\texttt{A}\ u\ v\ z$: 두 정점이 같은 성분에 속하면 루트를 $u$로 바꾸고, $u$에서 $v$까지의 경로에 있는 모든 정점의 값에 $z$를 더한다. 두 정점이 다른 성분에 속하면 무시한다.
- $\texttt{Q}\ u\ v$: 두 정점이 같은 성분에 속하면 루트를 $u$로 바꾸고, $u$에서 $v$까지의 경로에 있는 정점의 값의 합을 구한다.
명시한 경우 외에는 루트를 바꾸지 않는다.
입력
첫 번째 줄에 정수 $N$, $Q$가 공백으로 구분되어 주어진다. $(1\le N,Q\le200\,000)$
두 번째 줄부터 $Q$개의 줄에 걸쳐 본문에서 설명한 형식의 연산이 주어진다. 각 연산의 값은 공백으로 구분되어 주어진다. $(1\le u,v\le N; \lvert z\rvert\le10^6)$
출력
L, C 연산은 간선을 추가하거나 삭제했으면 $1$을, 그렇지 않으면 $0$을 출력한다. B 연산은 두 정점이 같은 성분에 속하면 $1$을, 그렇지 않으면 $0$을 출력한다.
G 연산은 정점의 값을, F 연산은 루트의 번호를 출력한다. Q 연산은 경로에 있는 정점의 값의 합을 출력하며, 두 정점이 다른 성분에 속하면 DISCONNECTED를 출력한다.
출력이 있는 연산마다 결과를 입력 순서대로 한 줄에 출력한다. 나머지 연산에는 아무것도 출력하지 않는다.
예제 입력 1
4 18 S 1 3 S 2 -1 L 1 2 L 2 3 Q 1 3 A 1 3 2 G 2 F 3 R 3 F 1 L 1 3 C 1 3 C 1 2 B 1 3 Q 1 3 F 2 L 1 4 Q 1 4
예제 출력 1
1 1 2 1 1 3 0 0 1 0 DISCONNECTED 2 1 5