canuc80k5920·21/30

Thứ Hạng Trên Đường Cây

Nộp bài trên LQDOJ

Bài 59 · Persistent Segment Tree

Cho một cây gồm đỉnh, đánh số từ đến . Đỉnh mang trọng số . Mỗi truy vấn yêu cầu xét tất cả trọng số của các đỉnh nằm trên một đường đơn của cây và tìm phần tử nhỏ thứ trong đa tập đó; vì vậy hai đỉnh có cùng trọng số vẫn được tính thành hai phần tử riêng.

Các truy vấn được mã hóa trực tuyến. Gọi là đáp án của truy vấn ngay trước, với trước truy vấn đầu tiên. Một dòng truy vấn ghi , nhưng đầu mút thứ nhất thật sự là

Đầu mút và số thứ hạng không bị mã hóa. Sau khi in đáp án hiện tại, hãy gán đáp án đó cho trước khi đọc nghĩa của truy vấn kế tiếp.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng thứ hai chứa số nguyên .
  • dòng tiếp theo, mỗi dòng chứa hai đỉnh nối bởi một cạnh.
  • dòng cuối, mỗi dòng chứa ba số nguyên .
  • Dữ liệu bảo đảm sau khi giải mã, và là các đỉnh hợp lệ, còn không vượt quá số đỉnh trên đường từ đến .

Output

  • Với mỗi truy vấn, in trọng số nhỏ thứ trên đường tương ứng, mỗi đáp án trên một dòng.

Constraints

  • .
  • .
  • .
  • Sau giải mã: .
  • .

Scoring

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

Example

Test 1

Input

6 4
8 3 10 3 6 12
1 2
1 3
2 4
2 5
3 6
4 6 3
13 4 2
2 5 2
0 6 1

Output

8
3
6
12

Giải thích: Truy vấn đầu xét đường , có dãy trọng số sau khi sắp là , nên đáp án thứ ba là . Ở truy vấn hai, ; các truy vấn sau tiếp tục dùng đáp án vừa in để giải mã, và truy vấn cuối có nên chỉ xét đỉnh .

Lời giải tóm tắt
  • Ý tưởng: Nén tọa độ các trọng số. Chọn đỉnh 1 làm gốc và xây root[u] là cây tần suất của các trọng số trên đường từ gốc đến u. Từ root[parent[u]], ta chèn thêm một lần hạng nén của w_u, chỉ sao chép các nút trên đường cập nhật.
  • Ý tưởng: Với truy vấn hai đỉnh u,v, đặt z=LCA(u,v) và p=parent[z]. Trong mọi miền giá trị, số phần tử thuộc đường u-v bằng tổng tần suất của
  • Ý tưởng: root[u] + root[v] - root[z] - root[p].
  • Ý tưởng: Ở mỗi mức của cây giá trị, tính số phần tử của tổ hợp trên nằm ở nửa trái. Nếu số này ít nhất k, đi trái; nếu không, đi phải và trừ số phần tử bên trái khỏi k. Khi tới lá, giải nén hạng trọng số.
  • Ý tưởng: Công thức giữ LCA đúng một lần: hai root đầu đếm phần gốc đến LCA hai lần, còn hai root bị trừ loại đúng phần chung trước LCA và một bản sao thừa của LCA. Do đó phép descent luôn xét đúng đa tập trọng số trên đường.
  • Ý tưởng: Tiền xử lý tốn O(n log n) thời gian và bộ nhớ. Mỗi truy vấn gồm LCA và descent, tốn O(log n).