#CF1249B2. 图书交换(困难版)

图书交换(困难版)

题目描述

每个测试的时间限制:1 秒
每个测试的内存限制:256 兆字节

简单版与困难版的唯一区别在于数据范围。

nn 个孩子,每人正在读一本独特的书。每天结束时,第 ii 个孩子会把自己的书交给第 pip_i 个孩子(如果 i=pii = p_i,则孩子把书留给自己)。保证所有的 pip_i11nn 中互不相同的整数(即 pp 是一个排列)。pp 序列每天固定不变。

例如,如果 n=6n = 6p=[4,6,1,3,5,2]p = [4,6,1,3,5,2],那么第一天结束时:

  • 11 个孩子的书会归第 44 个孩子所有;
  • 22 个孩子的书会归第 66 个孩子所有;
  • 依此类推。

第二天结束时:

  • 11 个孩子的书会归第 33 个孩子所有;
  • 22 个孩子的书会归第 22 个孩子所有;
  • 依此类推。

你的任务是,对于每个 ii11nn),确定第 ii 个孩子的书第一次返回他本人手中是在第几天。

考虑以下例子:p=[5,1,2,4,3]p = [5,1,2,4,3]。第 11 个孩子的书的传递过程如下:

  • 11 天后,书在第 55 个孩子手中;
  • 22 天后,书在第 33 个孩子手中;
  • 33 天后,书在第 22 个孩子手中;
  • 44 天后,书在第 11 个孩子手中。

因此,经过第 44 天后,第 11 个孩子的书第一次返回本人手中。第 44 个孩子的书则仅需 11 天就返回。

你需要回答 qq 组独立的查询。

输入格式

第一行包含一个整数 qq1q10001 \le q \le 1000)—— 查询的数量。接下来是 qq 组查询。

每组查询的第一行包含一个整数 nn1n21051 \le n \le 2 \cdot 10^5)—— 该查询中孩子的数量。
每组查询的第二行包含 nn 个整数 p1,p2,,pnp_1, p_2, \dots, p_n1pin1 \le p_i \le n,所有的 pip_i 互不相同,即 pp 是一个排列),表示第 ii 个孩子会把书交给第 pip_i 个孩子。

保证 n2105\sum n \le 2 \cdot 10^5(所有查询的 nn 之和不超过 21052 \cdot 10^5)。

输出格式

对于每组查询,输出一行 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n,其中 aia_i 表示该查询中第 ii 个孩子的书第一次返回他本人手中所需的天数。

6
5
1 2 3 4 5
3
2 3 1
6
4 6 2 1 5 3
1
1
4
3 4 1 2
5
5 1 2 4 3

1 1 1 1 1 
3 3 3 
2 3 3 2 1 3 
1 
2 2 2 2 
4 4 4 1 4