canuc80k5103·4/17

Trung Vị Đoạn

Nộp bài trên LQDOJ

Bài 51 · Parallel Binary Search

Cho mảng . Mỗi truy vấn xác định một đoạn .

Đặt . Sắp các phần tử theo thứ tự không giảm và đánh số vị trí từ . Lower median của đoạn là phần tử ở vị trí

Như vậy, khi chẵn, ta chọn phần tử ở giữa bên trái. Hãy in lower median của từng đoạn.

Input

  • Dòng đầu chứa và .
  • Dòng thứ hai chứa phần tử của mảng.
  • dòng tiếp theo chứa và của một đoạn truy vấn.

Output

  • Với mỗi truy vấn, in lower median trên một dòng.

Constraints

  • .
  • .
  • .
  • Với độ dài , lower median là phần tử thứ trong thứ tự tăng dần, dùng chỉ số .

Scoring

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

Example

Test 1

Input

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

Output

6
3
6
9

Giải thích: Toàn mảng sau khi sắp là nên trung vị là . Đoạn có lower median ; hai truy vấn còn lại lần lượt cho và .

Lời giải tóm tắt
  • Ý tưởng: Một lower median của đoạn dài len là phần tử nhỏ thứ k=(len+1)/2. Với ngưỡng giá trị v, predicate là “đoạn có ít nhất k phần tử không vượt v”, vốn đơn điệu.
  • Ý tưởng: Nén các giá trị phân biệt tăng dần. Trong mỗi vòng parallel binary search, reset Fenwick rồi quét các rank từ nhỏ đến lớn. Khi đến một rank, kích hoạt mọi vị trí có giá trị ở rank đó bằng +1; tổng Fenwick trên [l,r] khi ấy chính là số phần tử trong đoạn không vượt ngưỡng. Mọi truy vấn có cùng midpoint được kiểm tra ở bucket tương ứng.
  • Ý tưởng: Nếu số đếm đạt k, hạ cận trên; nếu chưa đạt, nâng cận dưới. Rank nhỏ nhất thỏa predicate ánh xạ ngược thành đúng lower median, kể cả khi độ dài chẵn hoặc có nhiều giá trị trùng.
  • Độ phức tạp: O((n+q) log n log V) thời gian và O(n+q+V) bộ nhớ, với V là số giá trị phân biệt.