0)、离散化
// arr[i] 为初始数组,下标范围为 [1, n]
for (int i = 1; i <= n; ++i) // step 1
tmp[i] = arr[i];
sort(tmp + 1, tmp + n + 1); // step 2
int len = unique(tmp + 1, tmp + n + 1) - (tmp + 1); // step 3
for (int i = 1; i <= n; ++i) // step 4
arr[i] = lower_bound(tmp + 1, tmp + len + 1, arr[i]) - tmp;
vector<int> tmp(arr); // tmp 是 arr 的一个副本
sort(tmp.begin(), tmp.end());
tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
for (int i = 0; i < n; ++i)
arr[i] = lower_bound(tmp.begin(), tmp.end(), arr[i]) - tmp.begin();
1)、单点增减+区间求和
思路:C[x]表示该点的元素:sum(x)=C[1]+C[2]+……C[x]
int arr[MAXN];
int lowbit(int x) { return x & (-x); }
inline int sum(int x){int res=0; while(x) res+=arr[x],x-=lowbit(x);return res;}
inline void add(int x,int n){while(x<MAXN) arr[x]+=n,x+=lowbit(x);}
inline int query(int x,int y){return sum(y)-sum(x-1);}
(2)、区间增减+单点查询
思路:C[x]表示该点元素与左边元素的差值:num[x]=C[1]+C[2]+……C[x]
int arr[MAXN];
int lowbit(int x) { return x & (-x); }
inline int sum(int x){int res=0; while(x) res+=arr[x],x-=lowbit(x);return res;}
inline void add(int x,int n){while(x<MAXN) arr[x]+=n,x+=lowbit(x);}
inline int update(int x,int y,int n){add(x,n); add(y+1,-n);}