QJ3886 - Hàng đợi thông điệp của Windows
Xem dưới dạng PDFHệ điều hành Windows duy trì một hàng đợi thông điệp cho mỗi tiến trình. Khi tiến trình thực hiện một thao tác nào đó, ví dụ nhấp chuột, hệ thống sẽ thêm một thông điệp tương ứng vào hàng đợi. Đồng thời nếu hàng đợi khác rỗng, tiến trình sẽ thực hiện vòng lặp thông điệp: lấy ra một thông điệp theo độ ưu tiên của thông điệp và thực hiện thao tác tương ứng. Lưu ý, giá trị độ ưu tiên nhỏ nghĩa là độ ưu tiên cao. Trong bài này, bạn cần mô phỏng hàng đợi thông điệp: thêm thông điệp vào hàng đợi và lấy thông điệp ra khỏi hàng đợi.
Dữ liệu vào
Dữ liệu vào gồm một số dòng, mỗi dòng là một lệnh: GET hoặc PUT, lần lượt biểu thị lấy ra thông điệp có độ ưu tiên cao nhất và thêm thông điệp vào hàng đợi. Nếu là lệnh PUT, ngay sau lệnh là một chuỗi ký tự biểu thị tên thông điệp (tối đa 10 ký tự), sau đó là 2 số nguyên, lần lượt biểu thị tham số và độ ưu tiên của thông điệp (độ ưu tiên là số nguyên dương nhỏ hơn 20). Có tối đa 60000 lệnh.
Lưu ý, mỗi thông điệp có thể xuất hiện 2 lần hoặc thậm chí nhiều hơn, dữ liệu test bảo đảm tại mọi thời điểm độ ưu tiên của các thông điệp trong hàng đợi là khác nhau (do đó tuy cùng một thông điệp có thể xuất hiện nhiều lần, nhưng tại một thời điểm bất kỳ sẽ không có 2 thông điệp giống hệt nhau trong hàng đợi, tức là tại mọi thời điểm các thông điệp trong hàng đợi đều khác nhau).
Dữ liệu ra
Với mỗi lệnh GET, in ra tên và tham số của thông điệp được lấy ra khỏi hàng đợi thông điệp; nếu hàng đợi rỗng, in ra EMPTY QUEUE!. Với lệnh PUT, không in gì cả.
Ví dụ
Input
GET
PUT msg1 10 5
PUT msg2 10 4
GET
GET
GET
Output
EMPTY QUEUE!
msg2 10
msg1 10
EMPTY QUEUE!
Ghi chú
Ghi chú
Với nhiều bộ input, trong C++ có thể dùng while(cin); để xử lý.
Phạm vi dữ liệu
$1\le t\le 1000,\ 1\le n\le 10^5,\ 1\le x\le 10^9,\ 1\le A[i]\le 10^9$ .
Trong đó, với mọi bộ dữ liệu, bảo đảm tổng các giá trị $n$ không vượt quá $10^5$ .
Nhận xét