만드는 중입니다

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

트리 위의 전하

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

요약
루트가 있는 트리에서 전하를 부모에게 올리거나, 자식들에게 똑같이 나누어 내리거나, 정점에 더하는 질의를 처리합니다. 마지막에 각 정점의 전하를 10^9+7로 나눈 나머지로 출력합니다.
난이도

어려움10점 중 8점

유형
트리, 수학, 시뮬레이션
정답자
아직 제출이 없습니다

문제

루트가 있는 트리가 주어진다. 각 정점 vv에는 음이 아닌 전하 cvc_v가 들어 있다. 다음 세 종류의 쿼리를 처리해야 한다.

  • 전하를 위로 옮기기: 모든 정점이 동시에 자신의 전하 전체를 직접 부모에게 옮긴다. 루트의 전하는 어디로도 옮겨지지 않는다. 즉 정점 vv의 자식이 u1,…,uku_1, \ldots, u_k라면, vv가 루트가 아닐 때 새 전하는 cu1+⋯+cukc_{u_1} + \cdots + c_{u_k}이고, vv가 루트이면 cu1+⋯+cuk+cvc_{u_1} + \cdots + c_{u_k} + c_v이다.
  • 전하를 아래로 옮기기: 모든 정점이 동시에 자신의 전하를 자식들에게 같은 비율로 나눠 준다. 정점 vv의 자식이 u1,…,uku_1, \ldots, u_k라면, 각 uiu_i의 새 전하는 cv/kc_v / k가 된다. 각 잎에는 길이가 충분한 가상의 직선 트리가 이어져 있다. 따라서 잎에서 전하를 아래로 내린 뒤 같은 횟수만큼 위로 올리면, 그 잎은 원래 전하를 그대로 유지한다.
  • 전하 추가: 정점 viv_i에 전하 xix_i를 더한다.

모든 쿼리를 처리한 뒤 각 정점의 전하를 출력한다.

입력

첫 줄에 정점 수 nn이 주어진다 (2≤n≤500 0002 \le n \le 500\,000). 둘째 줄에는 각 정점의 초기 전하 cic_i가 주어진다 (0≤ci<109+70 \le c_i < 10^9 + 7). 이어지는 n−1n-1개의 줄에는 간선 uiu_i, viv_i가 주어진다 (1≤ui,vi≤n1 \le u_i, v_i \le n). 입력 그래프는 트리임이 보장된다.

다음 줄에 쿼리 수 qq (0≤q≤500 0000 \le q \le 500\,000)가 주어진다. 이어지는 qq개의 줄이 쿼리이다. 위로 옮기는 쿼리는 ^로 표시한다. 아래로 옮기는 쿼리는 v로 표시한다. 전하 추가 쿼리는 +와 정수 viv_i, xix_i로 표시하며, 정점 viv_i에 전하 xix_i를 더한다는 뜻이다 (1≤vi≤n1 \le v_i \le n, 0≤xi<109+70 \le x_i < 10^9 + 7).

출력

nn개의 수를 출력한다. ii번째 수는 정점 ii의 최종 전하이다.

전하가 분수 p/qp/q로 주어질 때, 0≤x<109+70 \le x < 10^9 + 7이고 p≡x⋅q(mod109+7)p \equiv x \cdot q \pmod{10^9 + 7}을 만족하는 유일한 정수 xx를 출력한다.

예제3

  1. 예제 1

    입력
    5
    4 3 3 6 0
    1 2
    1 3
    2 4
    4 5
    5
    v
    + 1 7
    ^
    + 2 1
    v
    
    예상 출력
    0 500000009 500000009 4 6
    
  2. 예제 2

    입력
    2
    5 10
    1 2
    5
    v
    v
    v
    ^
    ^
    
    예상 출력
    0 5
    
  3. 예제 3

    입력
    4
    0 1 0 0
    1 2
    1 3
    1 4
    2
    ^
    v
    
    예상 출력
    0 333333336 333333336 333333336