Skip to main content

Practice · 4 of 5

Đếm phần tử khác nhau trong đoạn giá trị lớn

CHALLENGE
Difficulty: intermediate+25 XP

**Bài toán.** Cho dãy n số (giá trị tới 10^9) và q truy vấn [l, r]: trong a[l..r] có bao nhiêu GIÁ TRỊ khác nhau? Truy vấn nhiều → cần tiền xử lý: đáp án = số vị trí i ∈ [l, r] mà a[i] lần cuối xuất hiện TRƯỚC i (vị trí cuối cùng < l). Cài: với mỗi i, giữ pos[a[i]] (lần cuối); biến i thành điểm 1 tại pos[a[i]]+1 nếu tồn tại, truy vấn [l, i]... (mẹo offline: sort truy vấn theo r, Fenwick đếm vị trí "lần cuối trước i"). Cài đặt chuẩn: với mỗi truy vấn (l, r) sort theo r; quét i = 1..n; tại i, nếu a[i] đã xuất hiện tại p < i: add(p, -1); add(i, +1); cập nhật last[a[i]] = i; truy vấn (l, r) khi i = r: đáp án = query(r) - query(l - 1). **Ràng buộc:** 1 ≤ n, q ≤ 200 000; 1 ≤ a[i] ≤ 10^9. **Vào:** dòng đầu n q; dòng hai n số; q dòng: l r. **Ra:** q dòng, mỗi dòng số giá trị khác nhau trong [l, r].

Back to lesson: Practice: Fenwick Problem Set