Có n khách sạn nằm theo thứ tự từ 1 đến n. Khách sạn i hiện còn hi phòng trống. Lần lượt có m đoàn khách đến, đoàn thứ j cần rj phòng.
Với mỗi đoàn, hãy chọn khách sạn có chỉ số nhỏ nhất còn ít nhất rj phòng. Nếu chọn được, số phòng trống của khách sạn ấy giảm đi rj. Nếu không khách sạn nào đủ chỗ, đoàn không được phân bổ và trạng thái các khách sạn giữ nguyên.
Input
Dòng đầu chứa hai số nguyên n và m.
Dòng thứ hai chứa n số nguyên h1,h2,…,hn.
Dòng thứ ba chứa m số nguyên r1,r2,…,rm theo thứ tự các đoàn đến.
Output
In m số. Số thứ j là chỉ số khách sạn được chọn cho đoàn j, hoặc 0 nếu không có khách sạn phù hợp.
Constraints
1≤n,m≤2⋅105.
1≤hi,rj≤109.
Scoring
Subtask 1 (50% số điểm): n,m≤2000.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
4 5
3 1 4 2
2 3 1 4 2
Output
1 3 1 0 4
Giải thích: Ba đoàn đầu lần lượt vào khách sạn 1,3,1; sau đó không nơi nào còn 4 phòng. Đoàn cuối cần 2 phòng nên được xếp vào khách sạn 4.
Lời giải tóm tắt
Phân tích: Để biết một đoạn có khách sạn đủ chỗ hay không, chỉ cần biết sức chứa lớn nhất trong đoạn. Mỗi node cây đoạn lưu maximum của đoạn nó quản lý. Nếu maximum toàn cây nhỏ hơn yêu cầu, đáp án là 0. Ngược lại, ta đi từ gốc xuống: ưu tiên con trái nếu maximum của nó đủ lớn, chỉ sang con phải khi con trái không thể đáp ứng.
Thuật toán: Với từng yêu cầu x:
Thuật toán: 1. Nếu maximum ở gốc nhỏ hơn x, in 0. 2. Nếu không, đi xuống cây để tìm lá trái nhất có giá trị ít nhất x. 3. Trừ x tại lá đó, tính lại maximum trên đường về gốc và in chỉ số lá.
Chứng minh tính đúng đắn: Nếu maximum ở gốc nhỏ hơn x, mọi khách sạn đều thiếu phòng nên 0 là đúng. Trong trường hợp còn đáp án, tại mỗi node, nếu con trái có maximum ít nhất x thì tồn tại khách sạn hợp lệ ở nửa trái và mọi chỉ số nửa trái nhỏ hơn nửa phải, nên đi trái là bắt buộc để có chỉ số nhỏ nhất. Nếu con trái không đủ, không vị trí nào ở đó hợp lệ và đi phải không bỏ sót đáp án. Vì vậy lá tìm được là khách sạn hợp lệ có chỉ số nhỏ nhất.
Chứng minh tính đúng đắn: Sau khi trừ phòng và cập nhật tổ tiên, mọi node lại lưu đúng maximum, nên lập luận áp dụng cho yêu cầu kế tiếp. Thuật toán luôn đúng.
Độ phức tạp: Xây O(n), mỗi yêu cầu O(log n), bộ nhớ O(n).