#include #include #include #include using namespace std; const int MOD = 998244353; void solve() { int n; cin >> n; vector> v(n); for(auto& x: v) { cin >> x[0] >> x[1]; if(x[0] > x[1]) swap(x[0], x[1]); } sort(v.begin(), v.end(), [&](auto a, auto b) -> bool { return a[0] * int64_t(a[1]) < b[0] * int64_t(b[1]); }); int64_t ret = 1; for(int i = 0; i + 1 < n; i++) { if(v[i][0] > v[i+1][0] || v[i][1] > v[i+1][1]) return void(cout << "0\n"); } for(int i = 0; i < n;) { int j = i+1; while(j < n && v[i] == v[j]) j++; for(int a = 2; a <= j-i; a++) { ret *= a; ret %= MOD; } i = j; } v.erase(unique(v.begin(), v.end()), v.end()); for(int i = 0; i + 1 < v.size(); i++) { int64_t inc1 = 1; inc1 *= v[i+1][0] - v[i][0] + 1; inc1 %= MOD; inc1 *= v[i+1][1] - v[i][1] + 1; inc1 %= MOD; if(v[i][0] != v[i][1]) { if(v[i+1][0] >= v[i][1] && v[i+1][1] >= v[i][0]) { int64_t inc2 = 1; inc2 *= v[i+1][0] - v[i][1] + 1; inc2 %= MOD; inc2 *= v[i+1][1] - v[i][0] + 1; inc2 %= MOD; inc1 += inc2; inc1 %= MOD; } } ret *= inc1; ret %= MOD; } if(v.back()[0] != v.back()[1]) { ret *= 2; ret %= MOD; } cout << ret << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while(t--) solve(); }