PivotOJ

이진 트리

시간 제한: 1000ms메모리 제한: 1024MB출처: KOI 2024 1차BOJ 31966

문제

모든 노드의 자식 노드가 00개 또는 22개인 이진 트리 TT에 대해 S(T)S(T)의 값은 다음과 같이 정의한다.

  • TT에서 노드 uu를 루트로 하는 서브 트리는, uuuu의 자손 노드들로만 구성된 집합이다.
  • TT중위 순회 수열 p(T)p(T)TT를 중위 순회하면서 방문하는 노드들을 순서대로 나열한 수열로, 아래와 같이 정의할 수 있다.
    • TT의 루트 노드를 rr이라 하자. [r][r]rr 하나로만 구성된 길이 11의 수열이라고 하자.
    • 만약 rr의 자식 노드가 00개라면, p(T)p(T)[r][r]이다.
    • 만약 rr의 자식 노드가 22개라면, rr의 왼쪽 자식 노드를 루트로 하는 서브 트리가 XX, rr의 오른쪽 자식 노드를 루트로 하는 서브 트리가 YY일 때, p(T)p(T)p(X)p(X), [r][r], p(Y)p(Y)을 순서대로 이어붙인 수열이다.
  • TT의 리프 노드 개수를 kk라고 하자. TT의 리프 노드들에 1,2,,k1, 2, \cdots , k의 번호를 p(T)p(T)에서 나타나는 순서대 로 (즉, 중위 순회 방문 순서대로) 붙였다고 하자.
  • TT의 서브 트리를 선택하면, 해당 서브 트리에 포함된 리프 노드들이 덮인다고 하자.
  • 1 ≤ a ≤ b ≤ k일 때, f(a,b)f(a, b)는 리프 노드들 중 번호가 aa 이상 bb 이하인 리프 노드들만을 덮고 다른 리프 노드들은 덮지 않기 위해, TT에서 선택해야 하는 최소 서브 트리 개수이다.
  • S(T)S(T)의 값은 1 ≤ a ≤ b ≤ k인 모든 (a,b)(a, b) 정수 순서쌍에 대한 f(a,b)f(a, b)의 합을 109+710^9+7로 나눈 나머지이다.

예를 들어, 다음과 같은 이진 트리 TT가 있다고 가정해보자.

(a) 만든 트리 (b) 리프 노드에 번호를 붙인 트리

f(5,7)f(5, 7)의 값은 22이다. 다음과 같이 서브 트리 두 개를 선택하면 55, 66, 77번 리프 노드만 덮이기 때문이다.

이런 식으로 모든 1 ≤ a ≤ b ≤ 7에 대해 f(a,b)f(a, b)의 값의 합은 4747이고, 이를 109+710^9 + 7로 나눈 나머지를 구하면 S(T)=47S(T) = 47이다.


정수열 A1,A2,,ANA_1, A_2, \cdots , A_NB1,B2,,BNB_1, B_2, \cdots , B_N이 주어진다.

이진 트리 T0,T1,,TNT_0, T_1, \cdots , T_N을 다음과 같이 정의한다.

  • T0T_0은 노드가 11개인 트리
  • TiT_i 는 루트의 왼쪽 자식 노드를 루트로 하는 서브 트리가 TAiT_{A_i}이고, 루트의 오른쪽 자식 노드를 루트로 하는 서브 트리가 TBiT_{B_i}인 트리 (1 ≤ i ≤ N, 0 ≤ A_i ≤ i - 1, 0 ≤ B_i ≤ i - 1)

S(T1),S(T2),,S(TN)S(T_1), S(T_2), \cdots , S(T_N)을 구하는 프로그램을 작성하라.

입력

첫 번째 줄에 정수 NN이 주어진다.

다음 NN개의 줄 중 ii (1 ≤ i ≤ N)번째 줄에는 AiA_iBiB_i가 공백으로 구분되어 주어진다.

출력

NN개의 줄을 출력한다. ii (1 ≤ i ≤ N)번째 줄에는 S(Ti)S(T_i)를 출력해야 한다.

예제

예제 1

입력
5
0 0
1 0
1 2
3 1
4 4
출력
3
7
21
47
254

예제 2

입력
7
0 0
1 1
2 2
3 3
4 4
5 5
6 6
출력
3
13
65
337
1729
8641
41985
코드를 제출하려면 로그인하세요.