canuc80k5101·2/17

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

Nộp bài trên LQDOJ

Bài 51 · Parallel Binary Search

Có đỉnh và ban đầu chưa có cạnh. Trong ngày thứ , cạnh vô hướng thứ trong input được thêm vào đồ thị; không cạnh nào bị xóa.

Với mỗi truy vấn gồm hai đỉnh và , hãy tìm số ngày nhỏ nhất sao cho sau khi đã thêm cạnh đầu tiên, và nằm trong cùng một thành phần liên thông. Ngày là thời điểm trước khi thêm cạnh nào. Nếu điều đó không xảy ra ngay cả sau ngày , in .

Input

  • Dòng đầu chứa và .
  • dòng tiếp theo chứa hai đầu mút của cạnh được thêm trong ngày tương ứng.
  • dòng cuối chứa hai đỉnh của một truy vấn.

Output

  • Với mỗi truy vấn, in ngày nhỏ nhất làm hai đỉnh liên thông; in nếu sau ngày vẫn không liên thông.

Constraints

  • .
  • Mỗi đầu mút nằm trong và hai đầu của một cạnh khác nhau.
  • Hai đỉnh trong truy vấn có thể trùng nhau.

Scoring

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

Example

Test 1

Input

6 4 4
1 2
3 4
2 3
1 4
1 4
1 6
2 2
3 1

Output

3
-1
0
3

Giải thích: Sau cạnh thứ ba, các đỉnh nằm cùng thành phần nên hai truy vấn kết nối giữa chúng có đáp án . Đỉnh không nhận cạnh nào nên truy vấn đến nó cho , còn một đỉnh luôn tự liên thông từ ngày .

Lời giải tóm tắt
  • Ý tưởng: Với truy vấn (u,v), predicate ở ngày d là “u và v liên thông sau d cạnh đầu”. Khi đã đúng, predicate không thể trở lại sai vì chỉ có thêm cạnh.
  • Ý tưởng: Mỗi truy vấn giữ một khoảng nhị phân với sentinel sai và sentinel “chưa tìm thấy”. Trong một vòng, gom truy vấn theo midpoint ngày. Reset DSU, xử lý bucket ngày 0, rồi thêm lần lượt cạnh 1..m; ngay sau ngày d, DSU biểu diễn chính xác đồ thị gồm d cạnh đầu và ta kiểm tra bucket d.
  • Ý tưởng: Nếu hai gốc bằng nhau, midpoint đủ và hạ cận trên; nếu khác nhau, nâng cận dưới. Sau hội tụ, sentinel m+1 được đổi thành -1, còn truy vấn u=v tự đạt ở ngày 0.
  • Độ phức tạp: O((n+m+q) log(m+1) · α(n)) thời gian và O(n+m+q) bộ nhớ.