canuc80k3908·9/50

Đếm Phần Tử Vượt Ngưỡng

Nộp bài trên LQDOJ

Bài 39 · Sweep Line

Cho một mảng cố định. Mỗi truy vấn () hỏi số phần tử lớn hơn trong đoạn chỉ số từ đến .

Input

  • Dòng đầu chứa .
  • Dòng thứ hai chứa số .
  • Dòng thứ ba chứa .
  • Mỗi trong dòng tiếp theo chứa .

Output

  • Với mỗi truy vấn, in đáp án trên một dòng theo đúng thứ tự xuất hiện.

Constraints

  • .
  • .
  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

6
4 1 7 4 9 2
4
1 6 4
2 5 3
3 3 7
4 6 1

Output

2
3
0
3

Giải thích: Bốn truy vấn lần lượt đếm được và phần tử. Ở truy vấn đầu, hai giá trị bằng không được tính vì điều kiện là lớn hơn nghiêm ngặt.

Lời giải tóm tắt
  • Ý tưởng: Sắp các phần tử và truy vấn theo ngưỡng giảm dần; Fenwick đánh dấu vị trí có giá trị lớn hơn k.
  • Ý tưởng: 1. Tạo cặp (a_i,i), sắp giá trị giảm. 2. Sắp truy vấn theo k giảm, giữ id. 3. Với truy vấn hiện tại, kích hoạt mọi phần tử chưa dùng có a_i>k bằng Fenwick.add(i,1). 4. Đáp án là Fenwick.sum(r)-Fenwick.sum(l-1); phục hồi thứ tự id.
  • Tính đúng đắn: 1. Do cả hai danh sách giảm dần, trước mỗi truy vấn, tất cả và chỉ các phần tử có giá trị >k đã được kích hoạt. 2. Fenwick range sum đếm số vị trí kích hoạt trong [l,r], đúng bằng số a_i>k của truy vấn. 3. Mỗi truy vấn được xử lý với invariant đúng và được lưu theo id, nên toàn bộ đầu ra đúng.
  • Độ phức tạp: O((n+q) log n) thời gian, O(n+q) bộ nhớ.
  • Lưu ý cài đặt: Dùng >=k thay vì >k.
  • Lưu ý cài đặt: Sai thứ tự khi nhiều phần tử bằng k.
  • Lưu ý cài đặt: Không giữ id truy vấn.