canuc80k2500·1/50

Giá Trị Khác Nhau

Nộp bài trên LQDOJ

Bài 25 · Mo's Algorithm

Cho một dãy gồm số nguyên dương. Mỗi truy vấn chọn một đoạn liên tiếp từ vị trí đến vị trí (tính cả hai đầu). Trong một đoạn, một giá trị dù xuất hiện nhiều lần cũng chỉ được tính một lần. Với mỗi truy vấn, hãy xác định số giá trị khác nhau có mặt trong đoạn được chọn.

Input

  • Dòng đầu chứa số nguyên - số phần tử của dãy.
  • Dòng thứ hai chứa số nguyên .
  • Dòng thứ ba chứa số nguyên - số truy vấn.
  • Mỗi trong dòng tiếp theo chứa hai số nguyên và .

Output

  • Với mỗi truy vấn, in trên một dòng số giá trị khác nhau trong đoạn .

Constraints

  • .
  • với mọi .
  • .
  • với mọi truy vấn.

Scoring

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

Example

Test 1

Input

7
4 4 1 2 1 4 3
4
1 7
2 5
3 3
4 7

Output

4
3
1
4

Giải thích: Đoạn chứa bốn giá trị ; đoạn chứa ba giá trị . Truy vấn chỉ có giá trị , còn lại chứa đủ .

Lời giải tóm tắt
  • Ý tưởng: Xử lý các truy vấn theo thứ tự Mo. Cửa sổ hiện hành luôn là một đoạn của dãy; khi dịch một đầu mút, chỉ một phần tử được thêm hoặc xóa. Ta nén tọa độ để lưu tần suất trong mảng.
  • Ý tưởng: Trạng thái cần duy trì: Một giá trị đóng góp 1 khi tần suất của nó dương, ngược lại đóng góp 0. Mỗi lần tần suất thay đổi, trừ đóng góp cũ khỏi đáp án, cập nhật tần suất rồi cộng đóng góp mới.
  • Tính đúng đắn: Sau bốn vòng dịch biên của một truy vấn, cửa sổ hiện hành đúng bằng đoạn truy vấn. Khi một tần suất đổi từ 0 sang 1, số giá trị khác nhau tăng một; khi đổi từ 1 về 0, nó giảm một. Các thay đổi khác không ảnh hưởng biến distinct. Vì đáp án được khởi tạo đúng cho cửa sổ rỗng và mọi phép thêm/xóa đều bảo toàn tổng đóng góp, giá trị ghi cho từng truy vấn là chính xác.
  • Độ phức tạp: Với block size thích hợp, tổng số lần thêm/xóa là O((n+q)√n) theo mô hình Mo cổ điển; mỗi lần cập nhật tốn O(1). Bộ nhớ là O(n+q) sau nén tọa độ.
  • Lỗi thường gặp: Chỉ đếm những giá trị xuất hiện đúng một lần thay vì đếm mọi giá trị xuất hiện.
  • Lỗi thường gặp: Cập nhật thao tác xóa cùng chiều với thao tác thêm.
  • Lỗi thường gặp: Bỏ sót phần tử ở đầu phải vì nhầm đoạn đóng [l,r] với đoạn nửa mở.