**Ta sẽ chia bài toán ra từng subtask.**
Để thuận tiện hơn, ta sẽ gọi B(i) là chỉ số block của vị trí i
1. Giả sử Q= 1 :
+ Ta có thể duyệt từ l đến r rồi đếm số lượng phần tử >Ai bằng cấu trúc dữ liệu như Fenwick tree hoặc Segment tree.
2. Giả sử N≤1000 :
+ Gọi f(i,j) là số lượng phần tử Ax>Aj trong đoạn [i…j].
+ Gọi dp(i,j) là số nghịch đảo trong đoạn [i…j].
+ Ta có dp(l,r)=∑ri=lf(l,i).
+ Ta có thể chuẩn bị 2 mảng trong O(n2) và truy vấn trong O(1).
3. Từ (1) và (2), ta có thể chia căn như sau :
+ Đầu tiên ta sẽ chia mảng thành √n block.
+ Với mỗi block ta sẽ sort lại.
+ Gọi g(i,j) là số lượng phần tử Ax>Ai (B(x) =j).
+ Ta có thể tính g(i,j) bằng hàm [lower_bound](https://en.cppreference.com/w/cpp/algorithm/lower_bound) trong c++.
+ Từ đó, ta có thể tính 2 mảng ở như (2) nhưng thay vì dùng chỉ số phần tử thì ta tính với **chỉ số block**. Độ phức tạp cho bước này là O(n×√n×log(n)).
+ Khi truy vấn, ta dễ dàng tính được số nghịch đảo trong đoạn block [B(l)+1…B(r)−1].
+ Gọi pref(i,j)=∑jk=1g(i,k).Ta có thể tính nhanh nghịch đảo của 2 phần dư với phần block (P/S: đối với phần dư bên trái thì phải xử lí ngược với phần dư bên phải).
+ Đối với nghịch đảo giữa 2 phần dư thì ta có thể duyệt qua từng phần tử rồi dùng cấu trúc dữ liệu như Fenwick/Segment tree.
+ Tổng độ phức tạp là O((n+q)×√n×log(√n)).
4. Tới đây vẫn chưa kết thúc, với độ phức tạp của (3) thì ta có thể bị **TLE** với bộ test đủ mạnh.
+ Tới đây ta vẫn có thể tối ưu được nữa, phần còn lại xin mời bạn đọc thử sức.