#P12861. [NERC 2020 Online] Lookup Performance

[NERC 2020 Online] Lookup Performance

Description

二叉搜索树(binary search tree)是一种带根的二叉树,其节点存储的键值满足:每个节点的键值大于其左子树中所有节点的键值,并小于其右子树中所有节点的键值。

二叉搜索树可用于维护有序集合,并支持对集合执行多种查询操作。本题中我们考虑的查询是:在集合中查找位于区间 [L,R][L, R] 内的值的数量。

SS 为二叉搜索树中所有键值的集合。给定两个值 LLRR,查询的目标是找出满足 LxRL \le x \le RxSx \in S 的数量。以下递归函数在调用 lookup(root, L, R) 时会计算该值,其中 root 是二叉搜索树的根节点。

function lookup(v, L, R):
  if v == null:
    return 0
  if L <= v.min and v.max <= R:
    return v.count
  if v.max < L or R < v.min:
    return 0
  res = 0
  if L <= v.key and v.key <= R:
    res += 1
  res += lookup(v.left, L, R)
  res += lookup(v.right, L, R)
  return res

变量 v.leftv.rightv.minv.maxv.keyv.count 是二叉搜索树节点的字段:

  • v.leftv.right 分别是节点 vv 的左子节点和右子节点。
  • v.minv.max 分别是以节点 vv 为根的子树中的最小键值和最大键值。
  • v.key 是节点 vv 的键值。
  • v.count 是以节点 vv 为根的子树中的节点数量。

给定一棵键值为整数的二叉搜索树,以及若干查询,每个查询包含两个整数 LLRR。请计算在调用 lookup(root, L, R) 时,lookup 函数被调用的总次数(包括初始调用 lookup(root, L, R) 本身)。

Input Format

第一行包含一个整数 nn1n2000001 \le n \le 200\,000)——二叉搜索树的节点数量。

接下来的 nn 行描述树的节点。第 ii 行包含三个整数 lil_irir_ikik_i,分别表示第 ii 个节点的左子节点、右子节点和键值。如果节点没有左子节点或右子节点,则对应值为 00li=0l_i = 0i<lini < l_i \le nri=0r_i = 0i<rini < r_i \le n109ki109-10^9 \le k_i \le 10^9)。树的根节点为节点 11,保证这是一棵合法的二叉搜索树。

注意,v.minv.maxv.count 并未在输入中显式给出,因为它们可以通过 lil_irir_ikik_i 推导得出。

接下来一行包含一个整数 qq1q2000001 \le q \le 200\,000)——查询的数量。

接下来的 qq 行每行包含两个整数 LLRR109LR109-10^9 \le L \le R \le 10^9)——作为 lookup 函数的参数。

Output Format

输出 qq 行,第 ii 行包含一个整数——第 ii 个查询中 lookup 函数被调用的总次数。

7
2 3 4
4 0 2
5 6 8
0 0 1
0 7 5
0 0 9
0 0 6
5
2 7
0 10
2 8
4 4
3 3
7
1
7
3
3

Hint

翻译由 DeepSeek V3 完成