私はセグメント ツリーを学習しています(範囲最小クエリの例で) が、セグメント ツリーをクエリするためのアルゴリズムの一部の背後にある理由を理解するのに問題があります。
セグメントツリーの構築の部分を理解するのに問題はありませんが、この関数の理由を理解できません:
int RMQUtil(int *st, int ss, int se, int qs, int qe, int index)
{
// If segment of this node is a part of given range, then return the min of the segment
if (qs <= ss && qe >= se)
return st[index]; // this is the part I am struggling with
// If segment of this node is outside the given range
if (se < qs || ss > qe)
return INT_MAX;
// If a part of this segment overlaps with the given range
int mid = getMid(ss, se);
return minVal(RMQUtil(st, ss, mid, qs, qe, 2*index+1), RMQUtil(st, mid+1, se, qs, qe, 2*index+2));
}
このノードのセグメントが指定された範囲の一部である場合、セグメントの最小値を返します。