만드는 중입니다

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

트리와 XOR 쿼리

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

요약
루트가 있는 가중치 트리에서 간선 가중치 갱신을 처리하며, 각 질의마다 subtree(x)의 a와 subtree(y)의 b에 대한 경로 xor d(a,b)의 합을 출력한다.
난이도

어려움10점 중 8점

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

문제

1번 노드를 루트로 하고 간선에 가중치가 있는 트리가 주어진다. 모든 노드의 번호는 1,2,⋯ ,N1, 2, \cdots, N 이다. 두 노드 xx, yy 에 대하여 xx에서 yy로 가는 단순 경로 위의 모든 가중치를 xor한 값을 d(x,y)d(x,y)로 정의하자. x=yx=y 이면 d(x,y)=0d(x,y)=0 이다.

다음 두 쿼리를 수행하는 프로그램을 작성하시오.

1 xx vv : xx번 노드에서 xx번 노드의 부모로 가는 간선의 가중치를 vv 로 바꾼다.

2 xx yy : xx의 서브 트리에 속한 임의의 정점 aa와 yy의 서브 트리에 속한 임의의 정점 bb에 대하여, 모든 d(a,b)d(a,b) 값의 총합을 출력한다.

입력

첫째 줄에 트리의 노드 개수를 나타내는 정수 NN이 주어진다. (2≤N≤100,000)(2 \leq N \leq 100,000)

둘째 줄부터 N−1N-1개의 줄에는 간선에 대한 정보를 나타내는 정수 x,y,dx, y, d 가 주어진다. 이는 최초의 트리에서 xx번 노드와 yy번 노드를 잇는 간선의 가중치가 dd임을 나타낸다. (1≤x,y≤N(1 \leq x, y \leq N, x≠yx \neq y, 0≤d≤106)0 \leq d \leq 10^6)

다음 줄에는 쿼리의 개수를 나타내는 정수 QQ가 주어진다. (1≤Q≤100,000)(1 \leq Q \leq 100,000)

다음 QQ개의 줄에는 한 줄에 하나씩 다음과 같은 형식 중 하나로 쿼리가 주어진다. 주어지는 모든 입력은 정수이다.

  • 1 xx vv (2≤x≤N(2 \leq x \leq N, 0≤v≤106)0 \leq v \leq 10^6)
  • 2 xx yy (1≤x,y≤N)(1 \leq x, y \leq N)

2번 쿼리는 한 번 이상 주어지며, xx와 yy가 같을 수 있음에 유의하라.

출력

각각의 2번 쿼리의 결과를 순서대로 한 줄에 하나씩 출력한다.

힌트

xor 연산은 아래 링크에서 확인하자.

링크

예제1

  1. 예제 1

    입력
    5
    1 2 1
    1 3 0
    2 4 4
    2 5 10
    4
    2 3 3
    2 4 1
    1 3 10
    2 5 3
    
    예상 출력
    0
    28
    1