这种题的主要目的是找位置, 比如第一个前缀和等于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的最大位置
}