#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define all(x) x.begin(), x.end()
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T> using o_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T, typename R> using o_map = tree<T, R, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;
#define inf 1e9
#define MOD 1000000007
#define vint vector<int>
#define vll vector<ll>
#define no cout << "NO" << endl;
void solve() {
ll nby0 = 0 , nby1 = 0;
ll n ; cin >> n ;
vector < bool > fama0(n+1 , false ), fama1(n+1 , false );
map < ll , ll > mp ;
vector < ll > x0 , x1 ;
ll ans= 0;
for ( int i = 0 ; i < n; i++ ) {
ll x , y ; cin >> x >> y ;
if (y == 0 ) {
x0.pb(x );
fama0[x] = 1 ;
nby0 ++ ;
continue ;
}
fama1[x] = 1 ;
nby1++ ;
x1.pb(x) ;
}
ll len0 = x0.size(), len1 = x1.size() ;
ll mini0 = x0[0] , maxi0 = x0[len0-1] , mini1 = x1[0] , maxi1 = x1[len1 - 1 ] ;
ll sofar0 = 0 , sofar1 = 0 ;
for (int x = 0 ; x<= n ; x++) {
if (fama0[x]) sofar0++;
if ( fama1[x]) sofar1++ ;
if (x >0 && x <n-1 && fama0[x] && fama1[x-1] && fama1[x+1]) ans++;
if (x >0 && x <n-1 && fama1[x] && fama0[x-1] && fama0[x+1]) ans++;
if (fama0[x] && fama1[x] ) ans+=(nby0 - 1 + nby1-1) ;
// cout << ans << endl;
}
cout << ans << endl ;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGFsbCh4KSB4LmJlZ2luKCksIHguZW5kKCkKI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiB1c2luZyBvX3NldCA9IHRyZWU8VCwgbnVsbF90eXBlLCBsZXNzPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFI+IHVzaW5nIG9fbWFwID0gdHJlZTxULCBSLCBsZXNzPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CgojZGVmaW5lIGluZiAxZTkKI2RlZmluZSBNT0QgMTAwMDAwMDAwNwojZGVmaW5lIHZpbnQgdmVjdG9yPGludD4KI2RlZmluZSB2bGwgdmVjdG9yPGxsPgojZGVmaW5lIG5vIGNvdXQgPDwgIk5PIiA8PCBlbmRsOwoKdm9pZCBzb2x2ZSgpIHsKICBsbCBuYnkwID0gMCAsIG5ieTEgPSAwOwogICAgbGwgbiA7IGNpbiA+PiBuIDsKICAgIHZlY3RvciA8IGJvb2wgPiBmYW1hMChuKzEgLCBmYWxzZSApLCBmYW1hMShuKzEgLCBmYWxzZSApOwoKICAgIG1hcCA8IGxsICwgbGwgPiBtcCA7CiAgICB2ZWN0b3IgPCBsbCA+IHgwICwgeDEgOwogICAgbGwgYW5zPSAwOwogICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG47IGkrKyApIHsKICAgICAgICBsbCB4ICAsIHkgOyBjaW4gPj4geCA+PiB5IDsKICAgICAgICBpZiAoeSA9PSAwICkgewogICAgICAgICAgICB4MC5wYih4ICk7CiAgICAgICAgICAgIGZhbWEwW3hdID0gMSA7CiAgICAgICAgICAgIG5ieTAgKysgOwogICAgICAgICAgICBjb250aW51ZSA7CiAgICAgICAgfQogICAgICAgIGZhbWExW3hdID0gMSA7CiAgICAgICAgbmJ5MSsrIDsKICAgICAgICB4MS5wYih4KSA7CiAgICB9CiAgICBsbCBsZW4wID0geDAuc2l6ZSgpLCBsZW4xID0geDEuc2l6ZSgpIDsKICAgIGxsIG1pbmkwID0geDBbMF0gLCBtYXhpMCA9IHgwW2xlbjAtMV0gLCBtaW5pMSA9IHgxWzBdICwgbWF4aTEgID0geDFbbGVuMSAtIDEgXSA7CgogICAgbGwgc29mYXIwID0gMCAsIHNvZmFyMSAgPSAwIDsKICAgIGZvciAoaW50ICB4ID0gMCA7IHg8PSAgbiA7IHgrKykgewogICAgICAgIGlmIChmYW1hMFt4XSkgc29mYXIwKys7CiAgICAgICAgaWYgKCBmYW1hMVt4XSkgc29mYXIxKysgOwogICAgICAgIGlmICh4ID4wICAmJiB4IDxuLTEgJiYgZmFtYTBbeF0gJiYgZmFtYTFbeC0xXSAmJiBmYW1hMVt4KzFdKSBhbnMrKzsKICAgICAgICBpZiAoeCA+MCAgJiYgeCA8bi0xICYmIGZhbWExW3hdICYmIGZhbWEwW3gtMV0gJiYgZmFtYTBbeCsxXSkgYW5zKys7CiAgICAgICAgaWYgKGZhbWEwW3hdICYmIGZhbWExW3hdICkgYW5zKz0obmJ5MCAtIDEgKyBuYnkxLTEpIDsKICAgICAgIC8vIGNvdXQgPDwgYW5zIDw8IGVuZGw7CiAgICAgfQoKICAgIGNvdXQgPDwgYW5zIDw8IGVuZGwgOwp9CmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiNpZm5kZWYgT05MSU5FX0pVREdFCiAgICBmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKICAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiNlbmRpZgoKICAgIGludCB0ID0gMTsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K