canuc80k3102·3/50

Quan Hệ Trên Cây

Nộp bài trên LQDOJ

Bài 31 · Euler Tour

Cho một cây gồm đỉnh, đánh số từ đến và được chọn gốc tại đỉnh . Một đỉnh được gọi là tổ tiên của đỉnh khi xuất hiện trên đường đi từ gốc tới và .

Có truy vấn, mỗi truy vấn gồm hai đỉnh khác nhau và . Với từng truy vấn, hãy xác định quan hệ của hai đỉnh theo quy tắc sau:

  • In MA nếu là tổ tiên của .
  • Nếu điều trên không đúng, in RI nếu là tổ tiên của .
  • In SA nếu hai đỉnh không có quan hệ tổ tiên theo cả hai hướng.

Input

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

  • Mỗi dòng trong dòng cuối chứa hai số nguyên khác nhau và , mô tả một truy vấn.

Output

  • Với mỗi truy vấn, in trên một dòng đúng một trong ba chuỗi MA, RI, SA theo quy tắc đã nêu.

Constraints

  • .
  • .
  • Các cạnh tạo thành một cây và gốc của cây là đỉnh .
  • Trong mỗi truy vấn, .

Scoring

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

Example

Test 1

Input

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

Output

MA
RI
SA
MA
RI
SA

Giải thích: Đỉnh nằm trên đường từ tới , còn trong truy vấn thì quan hệ đúng theo chiều ngược lại. Các cặp và nằm ở hai nhánh khác nhau nên nhận kết quả SA.

Lời giải tóm tắt
  • Phân tích: Khi DFS đi vào một đỉnh v, lưu thời điểm tin[v]; khi toàn bộ cây con của v đã được xử lý, lưu tout[v]. Mọi đỉnh trong cây con của v được đi vào liên tiếp, vì vậy đoạn thời gian của một hậu duệ nằm trọn trong đoạn của tổ tiên.
  • Thuật toán: Gốc hóa cây tại 1 và thực hiện DFS bằng ngăn xếp để tính tin và tout. Với mỗi truy vấn, dùng hàm
  • Thuật toán: ancestor(u,v) = (tin[u] ≤ tin[v] và tout[v] ≤ tout[u]).
  • Thuật toán: Nếu hàm đúng theo chiều (u,v), in MA; nếu chỉ đúng theo chiều (v,u), in RI; nếu cả hai đều sai, in SA.
  • Chứng minh tính đúng đắn: Nếu u là tổ tiên của v, DFS đi vào u trước, xử lý toàn bộ cây con chứa v, rồi mới rời u; do đó đoạn của v nằm trong đoạn của u. Ngược lại, các đỉnh của mỗi cây con tạo thành một khối liên tiếp trong DFS, nên nếu đoạn của v nằm trong đoạn của u thì v thuộc cây con của u. Vì các đỉnh trong truy vấn khác nhau, phép kiểm tra này đúng chính xác với định nghĩa tổ tiên của đề. Ba nhánh xuất kết quả vì thế đều chính xác.
  • Độ phức tạp: Tiền xử lý O(n), mỗi truy vấn O(1), tổng thời gian O(n+q) và bộ nhớ O(n).