我写一道标记永久化的题目 https://www.luogu.com.cn/problem/UVA10587
然后单点查询是这样写的
int query(int u, int x, int s)
{
if (tr[u].l == x && tr[u].r == x)
{
s = max(s, tr[u].v);
return s;
}
s = max(s, tr[u].v);
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid) query(u << 1, x, s);
else query(u << 1 | 1, x, s);
}
结果开 O2 RE,改成这样之后就 AC 了
int query(int u, int x, int s)
{
if (tr[u].l == x && tr[u].r == x)
{
s = max(s, tr[u].v);
return s;
}
s = max(s, tr[u].v);
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid) s = max(s, query(u << 1, x, s));
else s = max(s, query(u << 1 | 1, x, s));
return s;
}
单点查询线段树难道不是一定能找到吗(保证了 x 一定合法),为什么要写返回值