这个写法是像这样子的:
if (op[0] == 'M')
{
int k, x;
cin >> k >> x;
update(1, k, n, x - (query(1, k, k) - query(1, k - 1, k - 1)));
}
而正确的见下:
if (op[0] == 'M')
{
int k, x;
cin >> k >> x;
int r;
if (k - 1 <= 0) r = x - query(1, k, k);
else r = x - (query(1, k, k) - query(1, k - 1, k - 1));
update(1, k, n, r);
}
原因:当 k - 1 = 0 时第一种会执行 query,然后如果恰好在这个函数里面也没有判断,就可能在一些奇奇怪怪的地方修改到这个 t[0] 的值,然后下次再查询到 query(1, k - 1, k - 1) 时就不是应该的 0,而是错误答案了。
所以在写一些数据结构(尤其递归结构,函数多的)一定要仔细检查有没有调用函数时参数越界之类的啊!!!