B. 广义线段树

传统 4500 ms 512 MiB
标准 IO
文本比较

题目描述

给定一棵有 2n12n-1 个节点的二叉树,节点的编号为 1,2,,2n11,2,\cdots,2n-1

编号为 pp 的节点(下称节点 pp)有两个给定的整数属性值 Lp,RpL_p,R_p,满足 LpRpL_p\le R_p

该二叉树还满足以下性质:

  • 节点 11 是根,L1=1L_1=1R1=nR_1=n
  • 对于任意一个节点 pp
    • Lp=RpL_p=R_p,则节点 pp 没有子节点。
    • Lp<RpL_p<R_p,则节点 pp 有两个子节点。在这里,我们区分左右子节点。设节点 pp 的左子节点是 uu,右子节点是 vv,有 Lu=LpL_u=L_pRu+1=LvR_u+1=L_vRv=RpR_v=R_p

我们称这样的树为广义线段树

对于任意区间 [l,r][l,r] 满足 l,rl,r 均为整数且 1lrn1\le l\le r\le n,考虑以下算法:

function visit(p,l,r,id)1if r<Lp or Rp<l2return3cnt1[id]cnt1[id]+14cnt2[p]cnt2[p]+15if lLp and Rpr6return7uleft child of p8vright child of p9visit(u,l,r,id)10visit(v,l,r,id)\begin{array}{l} \textbf{function }\text{visit}(p,l,r,\textit{id})\\ \begin{array}{rl} 1&\textbf{if }r<L_p\text{ or }R_p<l\\ 2&\quad\textbf{return}\\ 3&\textit{cnt}_1[\textit{id}]\gets\textit{cnt}_1[\textit{id}]+1\\ 4&\textit{cnt}_2[p]\gets\textit{cnt}_2[p]+1\\ 5&\textbf{if }l\le L_p\text{ and }R_p\le r\\ 6&\quad\textbf{return}\\ 7&u\gets\text{left child of }p\\ 8&v\gets\text{right child of }p\\ 9&\text{visit}(u,l,r,\textit{id})\\ 10&\text{visit}(v,l,r,\textit{id}) \end{array} \end{array}

给定 mm 个区间 [li,ri][l_i,r_i]i=1,2,,mi=1,2,\cdots,m),对于每个 ii 都执行 visit(1,li,ri,i)\text{visit}(1,l_i,r_i,i) 恰好一次。数组 cnt1\textit{cnt}_1(下标为 1,2,,m1,2,\cdots,m)和 cnt2\textit{cnt}_2(下标为 1,2,,2n11,2,\cdots,2n-1)的所有元素初始时均为 00,求它们最终的值。

输入格式

第一行两个整数 n,mn,m1n,m1061\le n,m\le10^6)。

接下来 2n12n-1 行中,第 ii 行表示节点 ii 的情况:

  • 每行先是两个整数 Li,RiL_i,R_i1LiRin1\le L_i\le R_i\le n)。
  • Li<RiL_i<R_i,还有两个整数 u,vu,v2u,v2n12\le u,v\le2n-1),分别表示节点 ii 的左子节点和右子节点。

接下来 mm 行中,第 ii 行两个整数 li,ril_i,r_i1lirin1\le l_i\le r_i\le n)。

输出格式

输出两行。

第一行 mm 个整数,其中第 ii 个数表示 cnt1[i]\textit{cnt}_1[i] 最终的值。

第二行 2n12n-1 个整数,其中第 ii 个数表示 cnt2[i]\textit{cnt}_2[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

输出

1 5 3 3 3
5 3 2 1 2 1 1