canuc80k3107·8/50

Tổng Trên Đường Từ Gốc

Nộp bài trên LQDOJ

Bài 31 · Euler Tour

Cho một cây gồm đỉnh, đánh số từ đến , được chọn gốc tại đỉnh . Mỗi đỉnh có giá trị hiện tại .

Bạn cần xử lý thao tác trực tuyến:

  • : thay giá trị của đỉnh bằng ;
  • : tính tổng giá trị hiện tại của các đỉnh trên đường đi duy nhất từ gốc đến , kể cả hai đầu mút.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng tiếp theo chứa số nguyên .
  • Mỗi dòng trong dòng tiếp theo chứa hai số nguyên , biểu diễn một cạnh vô hướng của cây.

  • Mỗi dòng trong dòng cuối mô tả một thao tác theo một trong hai dạng trên.

Output

  • Với mỗi thao tác loại , in tổng trên đường từ gốc đến đỉnh được hỏi.

Constraints

  • .
  • .
  • Với thao tác : .
  • Với thao tác : .
  • Các cạnh tạo thành một cây có gốc tại .
  • Kết quả có thể vượt phạm vi số nguyên bit có dấu.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

6 6
5 1 4 2 7 3
1 2
1 3
2 4
2 5
3 6
2 5
1 2 6
2 4
2 6
1 1 1
2 6

Output

13
13
12
8

Giải thích: Đường ban đầu có tổng ; sau khi đổi đỉnh , đường cũng có tổng . Phép gán cuối đổi đóng góp của gốc từ thành , nên tổng trên đường giảm từ xuống .

Lời giải tóm tắt
  • Nhận xét: Giá trị tại đỉnh v đóng góp vào đáp án của đúng các đỉnh nằm trong cây con của v: v là tổ tiên của s khi và chỉ khi đường gốc-s đi qua v. Sau Euler tour, tập hậu duệ ấy là đoạn [tin[v],tout[v]].
  • Thuật toán: Dùng Fenwick ở dạng mảng hiệu để hỗ trợ cộng đoạn và hỏi điểm. Ban đầu, với mỗi đỉnh v, cộng a[v] lên toàn đoạn cây con của v. Khi gán giá trị mới, cộng hiệu x-a[v] lên cùng đoạn; truy vấn 2 s là giá trị tích lũy tại tin[s].
  • Chứng minh tính đúng đắn: Một cập nhật của v phủ điểm tin[s] đúng khi s thuộc cây con v, tương đương v nằm trên đường từ gốc đến s. Vì thế tổng các cập nhật đang phủ điểm này bằng đúng tổng giá trị của mọi đỉnh trên đường; cập nhật hiệu duy trì đúng trạng thái sau phép gán.
  • Độ phức tạp: Khởi tạo và mỗi thao tác tốn O(log n), bộ nhớ O(n).