canuc80k5903·4/30

Vượt Qua Ngưỡng

Nộp bài trên LQDOJ

Bài 59 · Persistent Segment Tree

Cho một mảng tĩnh gồm số nguyên. Mỗi truy vấn có dạng và yêu cầu đếm số vị trí thỏa mãn đồng thời

và .

Dấu so sánh là nghiêm ngặt: phần tử có giá trị đúng bằng không được đếm.

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số nguyên của mảng.
  • Dòng thứ ba chứa số nguyên , là số truy vấn.
  • 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 số phần tử lớn hơn 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

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

Output

2
2
1
0
1

Giải thích: Trong toàn mảng, chỉ và lớn hơn . Ở truy vấn thứ tư, không phần tử nào của đoạn lớn hơn , còn đoạn một phần tử chứa nên cho kết quả .

Lời giải tóm tắt
  • Ý tưởng: Nén các giá trị của mảng. Tạo root[i] là cây tần suất của tiền tố a_1..a_i. Mỗi gốc mới được tạo bằng cách tăng tần suất tại hạng của a_i.
  • Ý tưởng: Với truy vấn [l,r,k], dùng upper_bound để tìm hạng đầu tiên có giá trị lớn hơn k. Hiệu số đếm giữa root[r] và root[l-1] trên phần miền từ hạng này đến cuối chính là đáp án.
  • Ý tưởng: Đúng đắn. Hai cây tiền tố triệt tiêu mọi vị trí trước l và giữ đúng các vị trí từ l đến r. upper_bound loại cả các giá trị bằng k, nên phần miền được cộng chứa chính xác và chỉ những phần tử lớn hơn ngưỡng.
  • Ý 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).