#include <bits/stdc++.h>
using namespace std;
#define int long long
// Binary search to find the type of soldier at position pos
int find_type(int pos) {
int lo = 1, hi = 2e6;
while (lo < hi) {
int mid = (lo + hi) / 2;
int sum = mid * (mid + 1) / 2;
if (sum < pos)
lo = mid + 1;
else
hi = mid;
}
return lo;
}
// Get starting index of type k
int start_index(int k) {
return (k - 1) * k / 2 + 1;
}
int get_type(int pos, map<int, int> &modified) {
if (modified.count(pos)) return modified[pos];
return find_type(pos);
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
int N, M;
cin >> N >> M;
set<int> positions_to_check;
vector<pair<int, int>> swaps(M);
for (int i = 0; i < M; ++i) {
int x, y;
cin >> x >> y;
swaps[i] = {x, y};
for (int d = -1; d <= 1; ++d) {
if (x + d >= 1) positions_to_check.insert(x + d);
if (y + d >= 1) positions_to_check.insert(y + d);
}
}
map<int, int> pos_type;
for (int pos : positions_to_check) {
pos_type[pos] = find_type(pos);
}
for (auto [x, y] : swaps) {
swap(pos_type[x], pos_type[y]);
}
int power = 0;
for (int pos : positions_to_check) {
if (pos_type.count(pos) && pos_type.count(pos + 1)) {
if (pos_type[pos] == pos_type[pos + 1]) power++;
}
}
cout << power << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwoKLy8gQmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSB0eXBlIG9mIHNvbGRpZXIgYXQgcG9zaXRpb24gcG9zCmludCBmaW5kX3R5cGUoaW50IHBvcykgewogICAgaW50IGxvID0gMSwgaGkgPSAyZTY7CiAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIGludCBtaWQgPSAobG8gKyBoaSkgLyAyOwogICAgICAgIGludCBzdW0gPSBtaWQgKiAobWlkICsgMSkgLyAyOwogICAgICAgIGlmIChzdW0gPCBwb3MpCiAgICAgICAgICAgIGxvID0gbWlkICsgMTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGhpID0gbWlkOwogICAgfQogICAgcmV0dXJuIGxvOwp9CgovLyBHZXQgc3RhcnRpbmcgaW5kZXggb2YgdHlwZSBrCmludCBzdGFydF9pbmRleChpbnQgaykgewogICAgcmV0dXJuIChrIC0gMSkgKiBrIC8gMiArIDE7Cn0KCmludCBnZXRfdHlwZShpbnQgcG9zLCBtYXA8aW50LCBpbnQ+ICZtb2RpZmllZCkgewogICAgaWYgKG1vZGlmaWVkLmNvdW50KHBvcykpIHJldHVybiBtb2RpZmllZFtwb3NdOwogICAgcmV0dXJuIGZpbmRfdHlwZShwb3MpOwp9CgppbnQzMl90IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBUOwogICAgY2luID4+IFQ7CiAgICB3aGlsZSAoVC0tKSB7CiAgICAgICAgaW50IE4sIE07CiAgICAgICAgY2luID4+IE4gPj4gTTsKCiAgICAgICAgc2V0PGludD4gcG9zaXRpb25zX3RvX2NoZWNrOwogICAgICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gc3dhcHMoTSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyArK2kpIHsKICAgICAgICAgICAgaW50IHgsIHk7CiAgICAgICAgICAgIGNpbiA+PiB4ID4+IHk7CiAgICAgICAgICAgIHN3YXBzW2ldID0ge3gsIHl9OwogICAgICAgICAgICBmb3IgKGludCBkID0gLTE7IGQgPD0gMTsgKytkKSB7CiAgICAgICAgICAgICAgICBpZiAoeCArIGQgPj0gMSkgcG9zaXRpb25zX3RvX2NoZWNrLmluc2VydCh4ICsgZCk7CiAgICAgICAgICAgICAgICBpZiAoeSArIGQgPj0gMSkgcG9zaXRpb25zX3RvX2NoZWNrLmluc2VydCh5ICsgZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG1hcDxpbnQsIGludD4gcG9zX3R5cGU7CiAgICAgICAgZm9yIChpbnQgcG9zIDogcG9zaXRpb25zX3RvX2NoZWNrKSB7CiAgICAgICAgICAgIHBvc190eXBlW3Bvc10gPSBmaW5kX3R5cGUocG9zKTsKICAgICAgICB9CgogICAgICAgIGZvciAoYXV0byBbeCwgeV0gOiBzd2FwcykgewogICAgICAgICAgICBzd2FwKHBvc190eXBlW3hdLCBwb3NfdHlwZVt5XSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgcG93ZXIgPSAwOwogICAgICAgIGZvciAoaW50IHBvcyA6IHBvc2l0aW9uc190b19jaGVjaykgewogICAgICAgICAgICBpZiAocG9zX3R5cGUuY291bnQocG9zKSAmJiBwb3NfdHlwZS5jb3VudChwb3MgKyAxKSkgewogICAgICAgICAgICAgICAgaWYgKHBvc190eXBlW3Bvc10gPT0gcG9zX3R5cGVbcG9zICsgMV0pIHBvd2VyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvdXQgPDwgcG93ZXIgPDwgJ1xuJzsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=