query(l,r,ql,qr,i,j): assert(l <= ql and qr <= r) if(l == ql and qr == r) return ask(i,j); m = (l+r)/2 if(ql < m) ret += query(l,m,ql,min(m,qr),i-1,j*2) if(qr > m) ret += query(m,r,max(m,ql),qr,i-1,j*2+1) return ret
ans = query(0,1 << n,l,r,n,0)
这个问题是 不能保证最小次数
例如 求a[0..14],那么 只需要 a[0..15] - a[15..15] 两次 而不是3次
这个从二进制上看单侧
14 = 1110, 也就是连续的最多需要两次可以计算出
所以想的是 l 的二进制 变为 r的二进制过程中, 只能 加 或 减 2的幂次,且幂次不能超过当前值的最高位的1