Cho một dãy gồm n số nguyên dương. Mỗi truy vấn chọn một đoạn liên tiếp từ vị trí l đến vị trí r (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 n - số phần tử của dãy.
Dòng thứ hai chứa n số nguyên a1,a2,…,an.
Dòng thứ ba chứa số nguyên q - số truy vấn.
Mỗi trong q dòng tiếp theo chứa hai số nguyên l và r.
Output
Với mỗi truy vấn, in trên một dòng số giá trị khác nhau trong đoạn al,al+1,…,ar.
Constraints
1≤n≤3⋅104.
1≤ai≤106 với mọi i.
1≤q≤2⋅105.
1≤l≤r≤n với mọi truy vấn.
Scoring
Subtask 1 (50% số điểm): n≤2000 và q≤5000.
Subtask 2 (50% 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 [1,7] chứa bốn giá trị 1,2,3,4; đoạn [2,5] chứa ba giá trị 1,2,4. Truy vấn [3,3] chỉ có giá trị 1, còn [4,7] lại chứa đủ 1,2,3,4.
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ở.