canuc80k7608·9/50

Ngày Kết Nối Đầu Tiên

Nộp bài trên LQDOJ

Bài 76 · Advanced Trees

Ban đầu có thành phố và chưa có con đường nào. Trong ngày liên tiếp, mỗi ngày đúng một con đường hai chiều được xây; con đường ở dòng thứ được hoàn thành vào cuối ngày .

Với mỗi truy vấn gồm hai thành phố và , hãy tìm ngày sớm nhất mà ta có thể đi từ đến bằng các con đường đã xây. Một hành trình có thể đi qua nhiều thành phố và đường. Nếu hai thành phố không bao giờ liên thông sau cả ngày, in . Khi , đáp án là vì không cần chờ xây đường.

Các con đường có thể lặp lại hoặc nối một thành phố với chính nó; những con đường không làm thay đổi tính liên thông vẫn chiếm một ngày trong lịch xây dựng.

Input

  • Dòng đầu chứa ba số nguyên : số thành phố, số con đường và số truy vấn.
  • dòng tiếp theo mô tả các con đường theo đúng thứ tự xây dựng. Dòng thứ chứa hai số , cho biết con đường ngày nối hai thành phố đó.
  • dòng cuối, mỗi dòng chứa hai số của một truy vấn.

Output

  • Với mỗi truy vấn, in trên một dòng:
  • nếu hai đầu truy vấn là cùng một thành phố;
  • ngày kết nối sớm nhất nếu chúng từng liên thông;
  • nếu chúng vẫn không liên thông sau ngày .

Constraints

  • .
  • Mọi chỉ số thành phố trong các con đường và truy vấn đều thuộc .

Scoring

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

Example

Test 1

Input

5 3 4
1 2
3 4
2 3
1 1
1 2
1 4
1 5

Output

0
1
3
-1

Giải thích: Thành phố tự nối với chính nó từ ngày , còn đường xuất hiện ở ngày . Hai thành phố và chỉ gặp nhau sau khi đường được xây ở ngày ; thành phố luôn cô lập nên truy vấn cuối cho .

Lời giải tóm tắt
  • Cây lưu lịch sử hợp nhất: Duyệt các con đường theo ngày và dùng DSU để theo dõi các thành phần liên thông. Ban đầu mỗi thành phố là một nút lá. Khi con đường ngày i nối hai thành phần khác nhau, tạo một nút mới mang giá trị i, gắn hai cây đại diện của hai thành phần làm con rồi hợp nhất chúng trong DSU. Nếu hai đầu đã cùng thành phần, con đường không tạo nút mới.
  • Cây lưu lịch sử hợp nhất: Kết quả là một rừng cây hợp nhất. Mỗi nút trong cây biểu diễn đúng tập thành phố thuộc cùng một thành phần ngay sau thời điểm ghi trên nút.
  • Trả lời truy vấn: Hai thành phố thuộc hai cây khác nhau thì không bao giờ liên thông. Nếu chúng ở cùng cây, tổ tiên chung thấp nhất của hai lá chính là nút đầu tiên có cây con chứa đồng thời cả hai thành phố. Giá trị ngày tại nút đó là thời điểm kết nối sớm nhất. Truy vấn cùng một thành phố được xử lý riêng với đáp án 0.
  • Trả lời truy vấn: Tiền xử lý LCA bằng binary lifting cho toàn bộ rừng.
  • Chứng minh đúng đắn: Sau mỗi ngày, cây đại diện của một DSU component chứa đúng các thành phố trong component đó: điều này đúng lúc đầu và được bảo toàn mỗi khi hai cây được gắn dưới một nút hợp nhất mới. Với hai lá u,v, nút thấp nhất chứa cả hai chính là lần đầu hai component chứa chúng được hợp nhất, nên ngày trên LCA là đáp án nhỏ nhất. Nếu không có chung gốc thì không có ngày nào hợp nhất hai component của chúng. Do đó thuật toán trả lời đúng mọi truy vấn.
  • Độ phức tạp: Có nhiều nhất 2n-1 nút. Tiền xử lý tốn O((n+m)α(n)+n log n) thời gian; mỗi truy vấn tốn O(log n). Bộ nhớ là O(n log n).