這種題的主要目的是找位置, 比如第一個前綴和等於k的位置,
1. 可以用樹狀數組 + 二分, 時間爲logn * logn, 這樣時間稍微慢了些;
2. 用倍增法這片博文寫得很好, http://www.hawstein.com/posts/binary-indexed-trees.html
int getKPos(int k){
int bitMask = bthPow[upper_bound(bthPow, bthPow + MAXBTH, size) - bthPow - 1];
int bitStart = 0;
while(bitMask){
if(bitStart + bitMask <= size){
if(bit[bitStart + bitMask] < k){
k -= bit[bitStart + bitMask];
bitStart += bitMask;
}
}
bitMask >>= 1;
}
return 1 + bitStart;// 注意這裏的加一, 因爲當前的前綴和是不滿足等於k的最大位置
}