如果你错误的点在于期望输出不是 0 而你输出 0 了,你看看你查询最大最小值的时候是不是这样写的:
int askmaxn(int p, int l, int r)
{
if(r < l)
return 0;
// 就是这个地方
if(l <= tpl && tpr <= r)
return tpx;
spread(p);
int ans = -114514;
int mid = (tpl + tpr) / 2;
if(mid >= l)
ans = max(ans, askmaxn(p * 2, l, r));
if(mid < r)
ans = max(ans, askmaxn(p * 2 + 1, l, r));
return ans;
}
这样写可以有效避免当 u=v 时输出初始值的问题,然而我们做一个假设:你的 u 和 v 跳到了同一个节点,此时就会直接返回 0,如果你此前的最大值是负数或者最小值是正数的话,你要查询的值就会被 0 覆盖。
改正:把这个东西删掉,然后在读取询问时加一句特判:
while(q --)
{
cin >> str;
scanf("%d%d", &l, &r);
if(str == "C")
{
if(d[st[l]].fa == ed[l])
changedot(st[l], r);
else
changedot(ed[l], r);
continue;
}
l += 1;
r += 1;
if(str == "N")
coverpath(l, r);
if(l == r)
{
printf("0\n");
continue;
}
// 这里 ↑
if(str == "SUM")
printf("%d\n", asksumpath(l, r));
if(str == "MAX")
printf("%d\n", askmaxnpath(l, r));
if(str == "MIN")
printf("%d\n", askminnpath(l, r));
}