SOJ ONLINE JUDGE

문제 136

동적 포리스트의 경로 합

내 상태
미제출
난이도
136번 문제 난이도 보기
Diamond I
출제자
rlatjwls7882
시간 제한
5000 ms
메모리 제한
1024 MB
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

제출

편집기에서 나가려면 Esc를 누른 뒤 Tab 또는 Shift와 Tab을 누르세요.