#D7000. Weighted Union Find Trees

    ID: 5814 Type: Default 3000ms 268MiB

Weighted Union Find Trees

Weighted Union Find Trees

There is a sequence A=a0,a1,...,an1A = a_0, a_1, ..., a_{n-1}. You are given the following information and questions.

  • relate(x,y,z)(x, y, z): aya_y is greater than axa_x by zz
  • diff(x,y)(x, y): report the difference between axa_x and aya_y (ayax)(a_y - a_x)

Constraints

  • 2n100,0002 \leq n \leq 100,000
  • 1q200,0001 \leq q \leq 200,000
  • 0x,y<n0 \leq x, y < n
  • xyx \ne y
  • 0z100000 \leq z \leq 10000
  • There are no inconsistency in the given information

Input

n  qn \; q query1query_1 query2query_2 : queryqquery_q

In the first line, nn and qq are given. Then, qq information/questions are given in the following format.

0 x  y  zx \; y\; z

or

1 x  yx \; y

where '0' of the first digit denotes the relate information and '1' denotes the diff question.

Output

For each diff question, print the difference between axa_x and aya_y (ayax)(a_y - a_x).

Example

Input

5 6 0 0 2 5 0 1 2 3 1 0 1 1 1 3 0 1 4 8 1 0 4

Output

2 ? 10

inputFormat

Input

n  qn \; q query1query_1 query2query_2 : queryqquery_q

In the first line, nn and qq are given. Then, qq information/questions are given in the following format.

0 x  y  zx \; y\; z

or

1 x  yx \; y

where '0' of the first digit denotes the relate information and '1' denotes the diff question.

outputFormat

Output

For each diff question, print the difference between axa_x and aya_y (ayax)(a_y - a_x).

Example

Input

5 6 0 0 2 5 0 1 2 3 1 0 1 1 1 3 0 1 4 8 1 0 4

Output

2 ? 10

样例

5 6
0 0 2 5
0 1 2 3
1 0 1
1 1 3
0 1 4 8
1 0 4
2

? 10

</p>