canuc80k5902·3/30

Thứ Hạng Trong Đoạn

Nộp bài trên LQDOJ

Bài 59 · Persistent Segment Tree

Cho mảng tĩnh . Với mỗi truy vấn gồm ba số , hãy xét đa tập các phần tử và tìm phần tử nhỏ thứ . Các phần tử có cùng giá trị vẫn được tính theo số lần xuất hiện.

Input

  • Dòng đầu chứa hai số nguyên và , lần lượt là độ dài mảng và số truy vấn.
  • Dòng thứ hai chứa số nguyên của mảng.
  • Mỗi dòng trong dòng tiếp theo chứa ba số nguyên .

Output

  • Với mỗi truy vấn, in phần tử nhỏ thứ trong đoạn trên một dòng.

Constraints

  • .
  • .
  • .
  • .

Scoring

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

Example

Test 1

Input

7 4
4 0 4 7 2 0 5
1 7 3
2 5 2
3 6 4
4 4 1

Output

2
2
7
7

Giải thích: Đoạn đầu sau khi sắp xếp là , nên phần tử nhỏ thứ ba là . Trong đoạn , thứ tự tăng là , do đó phần tử nhỏ thứ tư bằng .

Lời giải tóm tắt
  • Ý tưởng: Nén các giá trị khác nhau thành các hạng từ 1 đến s. Với mỗi tiền tố a_1..a_i, xây một gốc cây tần suất root[i]; gốc mới được tạo từ root[i-1] bằng cách tăng một đơn vị tại hạng của a_i.
  • Ý tưởng: Trong truy vấn [l,r], số phần tử thuộc bất kỳ miền giá trị nào bằng hiệu số đếm giữa root[r] và root[l-1]. Khi đi từ gốc xuống, tính số phần tử trong nửa trái. Nếu số đó ít nhất k, đáp án ở nửa trái; nếu không, bỏ qua toàn bộ nửa trái và tìm thứ k-leftCount ở nửa phải.
  • Ý tưởng: Đúng đắn. Hiệu hai cây tiền tố chứa đúng tần suất của đoạn. Quyết định ở mỗi mức giữ lại chính xác miền chứa phần tử thứ k; đến lá, hạng thu được là hạng của đáp án. Giải nén hạng trả đúng giá trị gốc.
  • Ý tưởng: Độ phức tạp. Tiền xử lý O(n log n), mỗi truy vấn O(log n), bộ nhớ O(n log n).