#include using namespace std; using ll = long long; ll calc(ll x, ll d) { ll sum = 0; int k = 0; while (sum < x) { sum = sum * 2 + d; ++k; } return k; } // 嘘解法:RL ペアでは必ず右側を先に完成させる ll pair_cost(ll D, ll A, ll B) { ll l = 0, r = D; ll gl = A, gr = D - B; ll res = 0; while (r > gr) { r = max(gr, (l + r + 1) / 2); ++res; } while (l < gl) { l = min(gl, (l + r) / 2); ++res; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; while (Q--) { int N, M; cin >> N >> M; vector> A(M); for (auto& [s, g] : A) cin >> s; for (auto& [s, g] : A) cin >> g; sort(A.begin(), A.end()); bool ok = true; for (int i = 1; i < M; ++i) { auto [s1, g1] = A[i - 1]; auto [s2, g2] = A[i]; if (g1 > g2 || (g1 == g2 && !(s1 == s2 && s1 == g1))) { ok = false; break; } } if (!ok) { cout << -1 << '\n'; continue; } vector type(M); for (int i = 0; i < M; ++i) { auto [s, g] = A[i]; if (s < g) type[i] = 1; if (s > g) type[i] = -1; } vector paired(M); ll ans = 0; for (int i = 0; i + 1 < M; ++i) { if (type[i] == 1 && type[i + 1] == -1) { paired[i] = paired[i + 1] = true; auto [s1, g1] = A[i]; auto [s2, g2] = A[i + 1]; ans += pair_cost( s2 - s1, g1 - s1, s2 - g2 ); } } for (int i = 0; i < M; ++i) { if (paired[i]) continue; auto [s, g] = A[i]; if (type[i] == 1) { if (i + 1 == M) ++ans; else ans += calc(g - s, A[i + 1].second - g); } if (type[i] == -1) { if (i == 0) ++ans; else ans += calc(s - g, g - A[i - 1].second); } } cout << ans << '\n'; } }