canuc80k1703·4/50

Phân Bổ Phòng

Nộp bài trên LQDOJ

Bài 17 · Segment Tree

Có khách sạn nằm theo thứ tự từ đến . Khách sạn hiện còn phòng trống. Lần lượt có đoàn khách đến, đoàn thứ cần 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 phòng. Nếu chọn được, số phòng trống của khách sạn ấy giảm đi . 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 và .
  • Dòng thứ hai chứa số nguyên .
  • Dòng thứ ba chứa số nguyên theo thứ tự các đoàn đến.

Output

  • In số. Số thứ là chỉ số khách sạn được chọn cho đoàn , hoặc nếu không có khách sạn phù hợp.

Constraints

  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( 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 ; sau đó không nơi nào còn phòng. Đoàn cuối cần phòng nên được xếp vào khách sạn .

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).