Với một truy vấn trên đoạn a..b ta phải đếm số lượng các số có vị trí tận cùng trong đoạn 1..b không nhỏ hơn a.
Dùng BIT bằng cách xử lí offline. Xử lí giống như bài KQUERY
Chèn mảng với truy vấn vào một list với :
- Mảng thì a[i].i là giá trị còn a[i].j là vị trí, a[i].type là phân loại là mảng
- Truy vấn a[i].i và a[i].j là đoạn còn a[i].id là chỉ số truy vấn Cây BIT lúc này với bit[x] sẽ lưu lại số lượng các vị trí tận cùng của các giá trị khác nhau trong đoạn 1..x
Ta sort tăng dần theo chỉ số j, mỗi lần xét đến một dữ liệu nào đó nếu nó là :
- Mảng thì ta sẽ cập nhật. Trước hết là những phần tử có vị trí lớn hơn (tức là đoạn từ i..n) sẽ tăng lên. Sau đó kiểm tra xem trước đó có phần tử nào giống nó không , có thì xóa bỏ nó. Cuối cùng là cập nhật lại vị trí cuối cùng của phần tử đó
- Truy vấn thì sẽ lấy nghiệm cho truy vấn. Nghiệm sẽ là số lượng các vị trí tận cùng có gt khác nhau trong đoạn 1..j trừ đi lượng trong đoạn 1..(i-1).