canuc80k3104·5/50

Vị Trí Trong Cây Con

Nộp bài trên LQDOJ

Bài 31 · Euler Tour

Một cây gốc gồm đỉnh được đánh số từ đến , gốc là đỉnh . Với mỗi đỉnh từ đến , biết cha trực tiếp ; luôn có .

Xét phép duyệt DFS preorder của một cây con: ghi đỉnh gốc của cây con trước, sau đó lần lượt duyệt toàn bộ cây con của các con trực tiếp theo thứ tự số hiệu tăng dần.

Mỗi truy vấn gồm hai số . Hãy in đỉnh đứng thứ trong preorder của cây con gốc . Nếu cây con đó có ít hơn đỉnh, in . Các truy vấn độc lập và không làm thay đổi cây.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng tiếp theo chứa số , trong đó là cha trực tiếp của đỉnh .

  • Mỗi dòng trong dòng cuối chứa hai số nguyên và .

Output

  • Với mỗi truy vấn, in số hiệu đỉnh cần tìm hoặc nếu vị trí đó vượt quá cây con của .

Constraints

  • .
  • .
  • với mọi .
  • .

Scoring

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

Example

Test 1

Input

9 7
1 1 2 2 3 3 6 6
1 1
1 6
2 3
3 4
6 3
6 4
7 1

Output

1
6
5
9
9
-1
7

Giải thích: Preorder toàn cây là ; vì vậy phần tử thứ sáu là . Cây con của có thứ tự , nên truy vấn vượt phạm vi và cho .

Lời giải tóm tắt
  • Phân tích: Trong preorder, khi bắt đầu xử lý một đỉnh u, DFS hoàn thành toàn bộ cây con của u trước khi sang phần nằm ngoài cây con. Vì vậy các đỉnh của cây con u tạo thành một đoạn liên tiếp trong mảng preorder.
  • Thuật toán: Dựng danh sách con từ mảng cha. Do các đỉnh được đọc theo thứ tự tăng và p_v<v, danh sách con tự có thứ tự số hiệu tăng. Duyệt DFS lặp để tạo mảng euler, lưu vị trí đầu tin[u] và kích thước cây con size[u].
  • Thuật toán: Với truy vấn (u,k), nếu k>size[u] thì in -1; ngược lại đáp án là euler[tin[u]+k-1].
  • Chứng minh tính đúng đắn: Preorder ghi u đầu tiên rồi xử lý trọn vẹn từng cây con của con trực tiếp, nên toàn bộ cây con u là đoạn bắt đầu tại tin[u] và có đúng size[u] phần tử. Phần tử thứ k của đoạn nằm ở độ lệch k-1, đúng với công thức của thuật toán. Nếu k lớn hơn độ dài đoạn thì vị trí không tồn tại, nên -1 là kết quả đúng.
  • Độ phức tạp: Tiền xử lý O(n), mỗi truy vấn O(1), tổng O(n+q) thời gian và O(n) bộ nhớ.