为什么合并线段树的 query 函数的递归部分要写成这样:
int res=0;
if(L<=mid)res+=query(t[k].lc,l,mid,L,R);
if(R>mid)res+=query(t[k].rc,mid+1,r,L,R);
return res;
而写成这样会死循环而 T 掉:
if(R<=mid)return query(t[k].lc,l,mid,L,R);
else if(L>mid)return query(t[k].rc,mid+1,r,L,R);
else return query(t[k].lc,l,mid,L,R)+query(t[k].rc,mid+1,r,L,R);
但是如果 R<=mid 这里不判等,写成 R<mid 就能过,就像这样:
if(R<mid)return query(t[k].lc,l,mid,L,R);
else if(L>mid)return query(t[k].rc,mid+1,r,L,R);
else return query(t[k].lc,l,mid,L,R)+query(t[k].rc,mid+1,r,L,R);
query 完整代码:
int query(int k,int l,int r,int L,int R){
if(L<=l&&r<=R)return t[k].sum;
int mid=(l+r)>>1;
if(R<mid)return query(t[k].lc,l,mid,L,R);
else if(L>mid)return query(t[k].rc,mid+1,r,L,R);
else return query(t[k].lc,l,mid,L,R)+query(t[k].rc,mid+1,r,L,R);
}