我正在尝试实现持久段树。查询有2种类型:1和2。
1 ind val:将数组中ind的值更新为val
2 k l r:在第k次更新操作之后,找到从索引l到r的元素之和。
我已经正确实现了更新和查询功能,并且它们在数组上正常工作。但是,当我形成不同的版本时,就会出现问题。基本上这是我的代码
while (q--) {
cin >> type;
if (type == 1) {
cin >> ind >> val;
node *t = new node;
*t = *ver[size - 1];
update(t, ind, val);
ver.pb(t);
size++;
}
}
cout << query(ver[0], 0, 1) << ' ' << query(ver[1], 0, 1) << query(ver[2], 0, 1);
现在的问题是它也在更改所有节点(即数组)的参数。这意味着3次更新后,所有版本都将存储最新的树。这可能是因为我没有正确分配新指针。对新指针所做的更改将反映在数组中的所有指针中
例如,如果我输入此内容
5
1 2 3 4 5
2
1 1 10
1 0 5
其中5是数组中的元素数,其后是数组。然后是q,查询数量,然后是所有查询。进行更新后,所有3个版本的(l,r)=(0,1)的查询函数的值都是15。但是应该是3、11、15。我在做什么错