seuOJ568 - 广义线段树
- 题目类型:传统
- 输入文件:标准输入流
- 输出文件:标准输出流
- 时间限制:4500 ms
- 空间限制:512 MiB
- 题目标签:Div.1, 2025 帆软杯
题目描述
给定一棵有 2n−1 个节点的二叉树,节点的编号为 1,2,⋯,2n−1。
编号为 p 的节点(下称节点 p)有两个给定的整数属性值 Lp,Rp,满足 Lp≤Rp。
该二叉树还满足以下性质:
- 节点 1 是根,L1=1,R1=n。
- 对于任意一个节点 p:
- 若 Lp=Rp,则节点 p 没有子节点。
- 若 Lp<Rp,则节点 p 有两个子节点。在这里,我们区分左右子节点。设节点 p 的左子节点是 u,右子节点是 v,有 Lu=Lp 且 Ru+1=Lv 且 Rv=Rp。
我们称这样的树为广义线段树。
对于任意区间 [l,r] 满足 l,r 均为整数且 1≤l≤r≤n,考虑以下算法:
function visit(p,l,r,id)12345678910if r<Lp or Rp<lreturncnt1[id]←cnt1[id]+1cnt2[p]←cnt2[p]+1if l≤Lp and Rp≤rreturnu←left child of pv←right child of pvisit(u,l,r,id)visit(v,l,r,id)
给定 m 个区间 [li,ri](i=1,2,⋯,m),对于每个 i 都执行 visit(1,li,ri,i) 恰好一次。数组 cnt1(下标为 1,2,⋯,m)和 cnt2(下标为 1,2,⋯,2n−1)的所有元素初始时均为 0,求它们最终的值。
输入格式
第一行两个整数 n,m(1≤n,m≤106)。
接下来 2n−1 行中,第 i 行表示节点 i 的情况:
- 每行先是两个整数 Li,Ri(1≤Li≤Ri≤n)。
- 若 Li<Ri,还有两个整数 u,v(2≤u,v≤2n−1),分别表示节点 i 的左子节点和右子节点。
接下来 m 行中,第 i 行两个整数 li,ri(1≤li≤ri≤n)。
输出格式
输出两行。
第一行 m 个整数,其中第 i 个数表示 cnt1[i] 最终的值。
第二行 2n−1 个整数,其中第 i 个数表示 cnt2[i] 最终的值。
样例
输入
4 5
1 4 2 3
1 2 4 5
3 4 6 7
1 1
2 2
3 3
4 4
1 4
2 3
1 1
4 4
2 2
输出