#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' ', StringSplitOptions.RemoveEmptyEntries), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); int Solve() { var n = I(); var az = Range(n, I); var bz = Range(n, I); var uz = new List(); for (var i = 0; i < n; i++) { var a = az[i]; var b = bz[i]; uz.Add(Math.Max(a, b)); uz.Add(Math.Min(a, b)); } var lisi = uz.LongestIncreasingSequence(); var res = lisi.Length; var used = new HashSet(lisi); List lisv = []; for (var i = 0; i < uz.Count; i++) if (!used.Contains(i)) { var v = uz[i]; var j = ~lisv.BinarySearch(v); if (j < 0) continue; if (j == lisv.Count) lisv.Add(v); else lisv[j] = v; } res += lisv.Count; return res; } var ans = Range(I(), Solve); Console.WriteLine(string.Join(Environment.NewLine, ans)); static class Extensions { public static int[] LongestIncreasingSequence(this IReadOnlyList a) where T: IComparable { var n = a.Count; var mins = new List(); var iz = new int[n].AsSpan(); iz.Fill(-1); for (var i = 0; i < n; i++) { var v = a[i]; var j = ~mins.BinarySearch(v); if (j < 0) continue; if (j == mins.Count) mins.Add(v); else mins[j] = v; iz[i] = j; } var res = new int[mins.Count]; var next = mins.Count - 1; for (var i = n - 1; i >= 0; i--) { if (iz[i] != next) continue; res[next--] = i; } return res; } }