Với mỗi khách theo thứ tự đến, bán vé đắt nhất không vượt quá ngân sách của khách; mỗi vé chỉ được bán một lần.
Input
Dòng đầu chứa n và m.
Dòng thứ hai chứa n giá vé hi.
Dòng thứ ba chứa m ngân sách ti theo thứ tự khách đến.
Output
Với mỗi khách, in giá vé được bán; nếu không còn vé phù hợp thì in −1.
Constraints
1≤n,m≤2⋅105.
1≤hi,ti≤109.
Scoring
Subtask 1 (50% số điểm): n,m≤1000.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
6 5
4 8 8 3 10 6
5 8 2 10 8
Output
4
8
-1
10
8
Giải thích: Các khách lần lượt nhận vé giá 4,8, không có vé phù hợp, rồi nhận 10 và bản sao 8 còn lại. Mỗi vé đã bán được xóa khỏi kho.
Lời giải tóm tắt
Phân tích: Với mỗi khách theo thứ tự đến, bán vé đắt nhất không vượt quá ngân sách của khách; mỗi vé chỉ được bán một lần. Cấu trúc dữ liệu chuẩn trong topic cho phép duy trì đúng thông tin cần thiết mà không phải duyệt lại toàn bộ trạng thái sau mỗi bước.
Thuật toán: Lưu toàn bộ giá trong multiset. Với ngân sách x, upper_bound(x) trỏ tới giá đầu tiên lớn hơn x; lùi một bước sẽ được vé đắt nhất hợp lệ, sau đó xóa đúng iterator đó.
Chứng minh tính đúng đắn: Mọi vé đứng trước upper_bound(x) đều không vượt quá ngân sách, và phần tử ngay trước nó là lớn nhất trong nhóm này. Nếu iterator đang ở begin() thì không có vé hợp lệ. Xóa đúng một bản sao bảo toàn chính xác kho vé cho các khách sau.
Độ phức tạp: Thời gian O((n+m) log n), bộ nhớ O(n).