public int[] GetPath(Node x)
        {
            var vs = new SList <int>();

            Expose(x);
            var stack = new Stack <(Node cur, bool right)>();

            stack.Push((x, true));
            while (stack.Count > 0)
            {
                var(cur, right) = stack.Pop();
                if (cur == null)
                {
                    continue;
                }
                if (right)
                {
                    Push(cur);
                    stack.Push((cur, false));
                    stack.Push((cur.Right, true));
                }
                else
                {
                    vs.Add(cur.Index);
                    stack.Push((cur.Left, true));
                }
            }
            return(vs.ToArray());
        }
        /// <summary>
        /// <para><paramref name="to"/>: 頂点 i からの遷移先。負数は遷移先なしとする。</para>
        /// <para><paramref name="start"/>: どの頂点からのパスを見るか</para>
        /// <para>制約: <paramref name="to"/>[i] &lt; |<paramref name="to"/>|, 0 ≦ <paramref name="start"/> &lt; |<paramref name="to"/>|</para>
        /// <para>計算量: O(N)</para>
        /// </summary>
        /// <param name="to">数値 i からの遷移先</param>
        /// <param name="start">どの頂点からのパスを見るか</param>
        public PathLoop(int[] to, int start)
        {
            var used = new int[to.Length];
            var list = new SList <int>(to.Length);
            int cur  = start;

            while (used[cur] == 0)
            {
                list.Add(cur);
                used[cur] = list.Count;
                cur       = to[cur];
                if ((uint)cur >= (uint)to.Length)
                {
                    Straight = list.ToArray();
                    Loop     = Array.Empty <int>();
                    return;
                }
            }
            var ix = used[cur] - 1;

            Straight = list.AsSpan()[..ix].ToArray();