#include #include #include using namespace std; const long long INF = 4e18; // 無限遠の壁 struct Elevator { long long s, g; int id; }; void solve() { int n, m; cin >> n >> m; vector S(m), G(m); for (int i = 0; i < m; ++i) cin >> S[i]; for (int i = 0; i < m; ++i) cin >> G[i]; vector E(m); for (int i = 0; i < m; ++i) { E[i] = {S[i], G[i], i}; } // Sの昇順、Sが同じ場合はGの昇順にソート sort(E.begin(), E.end(), [](const Elevator& a, const Elevator& b) { if (a.s != b.s) return a.s < b.s; return a.g < b.g; }); // 到達不可能性のチェック bool possible = true; for (int i = 0; i < m - 1; ++i) { if (E[i].s < E[i+1].s && E[i].g >= E[i+1].g) possible = false; if (E[i].s == E[i+1].s && E[i].g > E[i+1].g) possible = false; if (E[i].s != E[i+1].s && E[i].g == E[i+1].g) possible = false; } if (!possible) { cout << -1 << "\n"; return; } // シミュレーション用関数 auto simulate = [&](bool right_first) -> long long { long long cost = 0; vector X(m); for (int i = 0; i < m; ++i) X[i] = E[i].s; auto move_right = [&]() { for (int i = m - 1; i >= 0; --i) { if (X[i] < E[i].g) { long long w = (i + 1 < m) ? X[i + 1] : INF; while (X[i] < E[i].g) { long long F = (X[i] + w) / 2; // 切り捨て if (F >= E[i].g) { X[i] = E[i].g; cost++; break; } X[i] = F; cost++; } } } }; auto move_left = [&]() { for (int i = 0; i < m; ++i) { if (X[i] > E[i].g) { long long w = (i - 1 >= 0) ? X[i - 1] : -INF; while (X[i] > E[i].g) { long long F = (X[i] + w + 1) / 2; // 切り上げ if (F <= E[i].g) { X[i] = E[i].g; cost++; break; } X[i] = F; cost++; } } } }; if (right_first) { move_right(); move_left(); } else { move_left(); move_right(); } return cost; }; long long cost1 = simulate(true); long long cost2 = simulate(false); cout << min(cost1, cost2) << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int q; if (cin >> q) { while (q--) solve(); } return 0; }