二叉树结构体索引 t[p].l 与 p*2 有什么区别

建树语句

void build(int p, int l, int r)
{
    t[p].l = l;
    t[p].r = r;
    if (l == r)
    {
        t[p].value = a[l];
        return;
    }
    int mid = l + r >> 1;
    build(p * 2, l, mid);
    build(p * 2 + 1, mid + 1, r);
    t[p].value = t[p * 2].value + t[p * 2 + 1].value 


```;
}
正常运行



```c++
long long ask(int p, int x, int y)
{
if (x <= mid)
        ans += ask(p*2, x, y);
    if (y > mid)
        ans += ask(p*2+1, x, y);
}

long long ask(int p, int x, int y)
{
    if (x <= mid)
        ans += ask(t[p].l, x, y);
    if (y > mid)
        ans += ask(t[p].r, x, y);
    return ans;
}

为什么上面能得出正确答案 而下面却出问题
考虑过是叶节点问题,但叶节点也应该是一样的。数组用的是全局变量,已经初始化。不知道有什么没考虑到的地方

ask()中p应该是数组的下标,p*2得到的是下标;
而t[p].l是数组元素中的值,不是下标;