#BST0000010. Xóa nút có hai con (Delete a Two-Child Node from a BST)

Xóa nút có hai con (Delete a Two-Child Node from a BST)

Xóa nút có hai con (Delete a Two-Child Node from a BST)

Nguồn: Phước Hưng OJ

Phiên bản: Phước Hưng OJ Extended

Đề bài

Dựng BST từ dãy a1,a2,…,ana_1,a_2,\ldots,a_n theo đúng thứ tự chèn; khóa trùng bị bỏ qua.

Cho khóa xx được bảo đảm tồn tại và nút mang khóa xx có đúng hai con. Để kết quả của thao tác xóa được xác định duy nhất, bắt buộc dùng inorder successor của xx: đó là nút có khóa nhỏ nhất trong cây con phải của xx.

Thay khóa tại vị trí của xx bằng khóa của successor, sau đó xóa nút successor ở vị trí cũ của nó. Cây sau thao tác vẫn phải là một BST.

Hãy in preorder của cây sau khi xóa.

Input

Dòng đầu chứa số nguyên nn.

Dòng thứ hai chứa nn số nguyên a1,a2,…,ana_1,a_2,\ldots,a_n theo thứ tự chèn.

Dòng thứ ba chứa khóa xx cần xóa.

Output

In các khóa của cây sau thao tác xóa theo preorder, các khóa cách nhau bởi một dấu cách.

Subtask

Subtask 1 (20 điểm): 3≤n≤203\le n\le 20.

Subtask 2 (30 điểm): 3≤n≤50003\le n\le 5000.

Subtask 3 (50 điểm): 3≤n≤2000003\le n\le 200000.

Trong tất cả các subtask, aia_i và xx là số nguyên có dấu 64-bit; khóa trùng bị bỏ qua khi dựng cây; xx tồn tại và nút mang khóa xx có đúng 22 con.

Ví dụ

Input

7
8 3 10 1 6 14 4
3

Output

8 4 1 6 10 14

Giải thích

Nút 33 có hai con. Cây con phải của 33 có các khóa 66 và 44, trong đó khóa nhỏ nhất là 44, nên 44 là inorder successor của 33.

Khóa 44 thay thế vị trí của 33, rồi nút 44 cũ được xóa. Preorder của cây kết quả là 8 4 1 6 10 14.