Bài 32.2. Biên niên sử Khoa học Viễn tưởng - [Độ khó: Khá]
Bài 32.2. Biên niên sử Khoa học Viễn tưởng - [Độ khó: Khá]
Một nhà sử học về khoa học viễn tưởng muốn sắp xếp và quản lý các sự kiện lớn theo trình tự thời gian. Tuy nhiên, các khám phá mới hoặc thông tin bổ sung thường xuyên xuất hiện, đòi hỏi phải chèn các sự kiện vào giữa chuỗi đã có, hoặc điều chỉnh/xóa bỏ các sự kiện sai sót. Để dễ dàng điều hướng qua dòng thời gian (tiến và lùi), ông quyết định sử dụng một Danh sách liên kết đôi (Doubly Linked List).
Bạn cần phát triển một chương trình giúp nhà sử học quản lý "biên niên sử" này. Mỗi sự kiện có một mã ID duy nhất và một mô tả ngắn gọn (không cần xử lý mô tả, chỉ cần ID).
INPUT FORMAT
Dòng đầu tiên là một số nguyên N (1 <= N <= 1000), số lượng thao tác.
Tiếp theo là N dòng, mỗi dòng mô tả một thao tác:
- INSERT_AFTER <event_ID> <ref_ID>: Chèn một sự kiện mới- event_IDvào sau sự kiện có- ref_ID. Nếu- ref_IDlà -1, sự kiện mới được chèn vào cuối danh sách.- event_IDvà- ref_IDlà các số nguyên dương duy nhất.
- INSERT_BEFORE <event_ID> <ref_ID>: Chèn một sự kiện mới- event_IDvào trước sự kiện có- ref_ID. Nếu- ref_IDlà -1, sự kiện mới được chèn vào đầu danh sách.
- DELETE <event_ID>: Xóa sự kiện có- event_IDkhỏi biên niên sử.
- PRINT_FORWARD: In ra các- event_IDtheo trình tự thời gian (từ đầu đến cuối).
- PRINT_BACKWARD: In ra các- event_IDngược trình tự thời gian (từ cuối về đầu). Tất cả các- event_IDđều là số nguyên dương và không trùng lặp (1 <=- event_ID<= 10^9). Các thao tác- INSERT_AFTERvà- INSERT_BEFOREđảm bảo- ref_IDluôn tồn tại trong danh sách trừ trường hợp- ref_IDlà -1. Các thao tác- DELETEđảm bảo- event_IDluôn tồn tại trong danh sách.
OUTPUT FORMAT
Với mỗi thao tác PRINT_FORWARD hoặc PRINT_BACKWARD, in ra các event_ID cách nhau bởi dấu cách.
Nếu danh sách rỗng, in ra "Empty".
Ví dụ:
Input:
8
INSERT_AFTER 10 -1
INSERT_BEFORE 20 10
INSERT_AFTER 30 20
PRINT_FORWARD
DELETE 20
INSERT_AFTER 40 30
PRINT_BACKWARD
DELETE 10Output:
20 30 10
40 30Giải thích:
- INSERT_AFTER 10 -1: Chèn 10 vào cuối. List:- 10.
- INSERT_BEFORE 20 10: Chèn 20 trước 10. List:- 20 <-> 10.
- INSERT_AFTER 30 20: Chèn 30 sau 20. List:- 20 <-> 30 <-> 10.
- PRINT_FORWARD: In ra- 20 30 10.
- DELETE 20: Xóa 20. List:- 30 <-> 10.
- INSERT_AFTER 40 30: Chèn 40 sau 30. List:- 30 <-> 40 <-> 10.
- PRINT_BACKWARD: In ra- 10 40 30.
- DELETE 10: Xóa 10. List:- 30 <-> 40.
 
    
Comments