canuc80k3604·5/50

Cạnh Nhẹ Nhất Và Nặng Nhất

Nộp bài trên LQDOJ

Bài 36 · Lowest Common Ancestor

Cho một cây gồm đỉnh, đánh số từ đến . Mỗi cạnh có một trọng số nguyên dương. Với hai đỉnh khác nhau , đường đi duy nhất giữa chúng chứa ít nhất một cạnh.

Hãy tìm trên đường đi đó:

  • trọng số nhỏ nhất trong các cạnh;
  • trọng số lớn nhất trong các cạnh.

Cần trả lời truy vấn độc lập.

Input

  • Dòng đầu chứa số nguyên .
  • dòng tiếp theo, mỗi dòng chứa ba số nguyên : cạnh nối với có trọng số .
  • Dòng tiếp theo chứa số nguyên .
  • dòng cuối, mỗi dòng chứa hai đỉnh khác nhau .

Output

  • Với mỗi truy vấn, in trên một dòng hai số nguyên: trọng số nhỏ nhất và trọng số lớn nhất trên đường đi từ tới , theo thứ tự đó.

Constraints

  • .
  • .
  • .
  • trên mỗi cạnh; trong mỗi truy vấn.
  • .
  • cạnh tạo thành một cây.
  • Input chỉ chứa một test case.

Scoring

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

Example

Test 1

Input

7
1 2 8
1 3 3
2 4 6
2 5 10
3 6 4
6 7 12
4
4 5
4 7
3 7
1 5

Output

6 10
3 12
4 12
8 10

Giải thích: Đường có hai trọng số . Đường từ tới đi qua các cạnh có trọng số , nên cặp min-max là .

Lời giải tóm tắt
  • Ý tưởng: Ngoài bảng tổ tiên up[j][v], ta lưu hai bảng:
  • Ý tưởng: mn[j][v]: trọng số nhỏ nhất trên cạnh từ đi lên;
  • Ý tưởng: mx[j][v]: trọng số lớn nhất trên cùng đoạn.
  • Ý tưởng: Khi ghép hai khối dài , tổ tiên được ghép như binary lifting thông thường, còn min và max được gộp bằng phép min và max. Hai phép này có tính kết hợp nên mọi cách chia đường đi thành các khối nhảy đều cho cùng kết quả.
  • Ý tưởng: Với truy vấn , nâng đỉnh sâu hơn tới cùng độ sâu và gộp dữ liệu của từng khối đã đi qua. Nếu hai đỉnh chưa trùng, xét mức nhảy từ lớn xuống nhỏ; khi tổ tiên sau bước nhảy còn khác nhau, nâng cả hai và gộp cả hai đoạn. Cuối cùng gộp hai cạnh nối chúng với LCA. Các đoạn này rời nhau và phủ đúng toàn bộ đường từ tới , nên cặp min-max thu được là chính xác.
  • Ý tưởng: Tiền xử lý tốn ; mỗi truy vấn ; bộ nhớ .