//Coder: Balajiganapathi #define TRACE #define DEBUG #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector vi; typedef pair pi; typedef vector vs; // Basic macros #define st first #define se second #define all(x) (x).begin(), (x).end() #define ini(a, v) memset(a, v, sizeof(a)) #define re(i,s,n) for(int i=s;i<(n);++i) #define rep(i,s,n) for(int i=s;i<=(n);++i) #define fr(i,n) re(i,0,n) #define repv(i,f,t) for(int i = f; i >= t; --i) #define rev(i,f,t) repv(i,f - 1,t) #define frv(i,n) rev(i,n,0) #define pu push_back #define mp make_pair #define sz(x) (int)(x.size()) const int oo = 2000000009; const double eps = 1e-9; #ifdef TRACE #define trace1(x) cerr << #x << ": " << x << endl; #define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl; #define trace3(x, y, z) cerr << #x << ": " << x << " | " << #y << ": " << y << " | " << #z << ": " << z << endl; #define trace4(a, b, c, d) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << endl; #define trace5(a, b, c, d, e) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << endl; #define trace6(a, b, c, d, e, f) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << " | " << #f << ": " << f << endl; #else #define trace1(x) #define trace2(x, y) #define trace3(x, y, z) #define trace4(a, b, c, d) #define trace5(a, b, c, d, e) #define trace6(a, b, c, d, e, f) #endif const int mx = 1000006, nmax = 1003; int n, m; pi queens[mx]; int di[] = {1, 1, -1, -1, 2, 2, -2, -2}, dj[] = {2, -2, 2, -2, 1, -1, 1, -1}; //Keep track of whether there is queen along these squares int inrow[nmax], incol[nmax], indiag1[3 * nmax], indiag2[3 * nmax]; int atleast1[nmax][nmax], atleast2[nmax][nmax]; int main() { int t; cin >> t; assert(1 <= t && t <= 10); while(t--) { ini(inrow, 0); ini(incol, 0); ini(indiag1, 0); ini(indiag2, 0); ini(atleast1, 0); ini(atleast2, 0); cin >> n >> m; assert(1 <= n && n <= 1000); assert(0 <= m && m <= 1000000); set s; fr(i, m) { cin >> queens[i].st >> queens[i].se; assert(!s.count(queens[i])); s.insert(queens[i]); assert(1 <= queens[i].st && queens[i].st <= n); assert(1 <= queens[i].se && queens[i].se <= n); inrow[queens[i].st] = 1; incol[queens[i].se] = 1; indiag1[nmax + queens[i].st - queens[i].se] = 1; indiag2[queens[i].st + queens[i].se] = 1; } int ans = 0; //Try for all queens each square from which it may be attacked fr(i, m) { fr(d, 8) { pi nxt = mp(queens[i].st + di[d], queens[i].se + dj[d]); if(nxt.st < 1 || nxt.st > n || nxt.se < 1 || nxt.se > n) continue; if( inrow[nxt.st] || incol[nxt.se] || indiag1[nmax + nxt.st - nxt.se] || indiag2[nxt.st + nxt.se]) continue; //Keep track of howmany queens are attacked form this square if(!atleast1[nxt.st][nxt.se]) { atleast1[nxt.st][nxt.se] = 1; } else if(!atleast2[nxt.st][nxt.se]) { atleast2[nxt.st][nxt.se] = 1; ++ans; } } } printf("%d\n", ans); } return 0; }