canuc80k3106·7/50

Tổng Trong Cây Con

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 thuộc một trong hai loại:

  • : thay giá trị của đỉnh bằng ;
  • : tính tổng giá trị hiện tại của tất cả các đỉnh thuộc cây con gốc , trong đó có cả đỉnh .

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 cần tìm trên một dòng.

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 2
1 5 10
2 1
2 3
1 1 8
2 1

Output

10
25
7
28

Giải thích: Ban đầu cây con của có tổng . Sau khi đổi giá trị đỉnh thành , tổng toàn cây là ; lần đổi cuối làm tổng này tăng thêm , thành .

Lời giải tóm tắt
  • Nhận xét: Trong thứ tự preorder Euler, toàn bộ các đỉnh của cây con s nằm liên tiếp từ tin[s] đến tout[s]. Ta đặt giá trị của đỉnh v tại vị trí tin[v], biến truy vấn cây con thành truy vấn tổng một đoạn trên mảng.
  • Thuật toán: Duyệt DFS lặp để tính tin,tout. Dùng Fenwick tree lưu giá trị tại từng vị trí Euler. Khi gán a[s]=x, cộng hiệu x-a[s] tại tin[s]; khi hỏi cây con, lấy prefix(tout[s])-prefix(tin[s]-1).
  • Chứng minh tính đúng đắn: Tính liên tiếp của cây con trong preorder bảo đảm đoạn [tin[s],tout[s]] chứa đúng và đủ các đỉnh cần cộng. Fenwick luôn giữ giá trị hiện tại vì mỗi phép gán được chuyển thành đúng phần chênh lệch, nên tổng đoạn trả về đúng sau mọi thao tác.
  • Độ phức tạp: Tiền xử lý O(n log n) và mỗi thao tác O(log n); bộ nhớ O(n).