#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T> using oset=tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define ll long long
#define ar array
const int mxN=1e5;
int n, xl[mxN], xr[mxN];
struct event {
int x, type, y;
bool operator<(const event &o) {
return make_pair(x, type)<make_pair(o.x, o.type);
}
};
void solve() {
//input
cin >> n;
for(int i=0; i<n; ++i)
cin >> xl[i] >> xr[i];
//find the longest segments from overlaps
map<int, int> mpl, mpr;
for(int i=0; i<n; ++i) {
if(mpl.find(xl[i])==mpl.end())
mpl[xl[i]]=xr[i];
else
mpl[xl[i]]=max(xr[i], mpl[xl[i]]);
if(mpr.find(xr[i])==mpr.end())
mpr[xr[i]]=xl[i];
else
mpr[xr[i]]=min(xl[i], mpr[xr[i]]);
}
//create the events
vector<event> ve;
for(auto a : mpr) {
//xl[i] = a.second, xr[i] = a.first
//right segment i should be active in [xl[i], xr[i])
//add this right segment at time xl[i]
ve.push_back({a.second, 1, a.first});
//remove this right segment at time xr[i]
ve.push_back({a.first, 2, a.first});
}
for(auto a : mpl) {
//xl[i] = a.first, xr[i] = a.second
//query this segment which extends to xr[i] at time xl[i]
ve.push_back({a.first, 3, a.second});
}
sort(ve.begin(), ve.end());
//sweep
ll ans=0;
//data structure to store the active right segments
oset<int> s;
for(event e : ve) {
if(e.type==1) {
//add segment
s.insert(e.y);
} else if(e.type==2) {
//remove segment
s.erase(e.y);
} else {
//left segment i intersects right segment j if xr[j] <= xr[i]
//count right segments <= e.y
ans+=s.order_of_key(e.y+1);
}
}
cout << ans+1 << "\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--)
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgb3NldD10cmVlPFQsIG51bGxfdHlwZSwgbGVzczxUPiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGFyIGFycmF5Cgpjb25zdCBpbnQgbXhOPTFlNTsKaW50IG4sIHhsW214Tl0sIHhyW214Tl07CgpzdHJ1Y3QgZXZlbnQgewoJaW50IHgsIHR5cGUsIHk7Cglib29sIG9wZXJhdG9yPChjb25zdCBldmVudCAmbykgewoJCXJldHVybiBtYWtlX3BhaXIoeCwgdHlwZSk8bWFrZV9wYWlyKG8ueCwgby50eXBlKTsKCX0KfTsKCnZvaWQgc29sdmUoKSB7CgkvL2lucHV0CgljaW4gPj4gbjsKCWZvcihpbnQgaT0wOyBpPG47ICsraSkKCQljaW4gPj4geGxbaV0gPj4geHJbaV07CgkKCS8vZmluZCB0aGUgbG9uZ2VzdCBzZWdtZW50cyBmcm9tIG92ZXJsYXBzCgltYXA8aW50LCBpbnQ+IG1wbCwgbXByOwoJZm9yKGludCBpPTA7IGk8bjsgKytpKSB7CgkJaWYobXBsLmZpbmQoeGxbaV0pPT1tcGwuZW5kKCkpCgkJCW1wbFt4bFtpXV09eHJbaV07CgkJZWxzZQoJCQltcGxbeGxbaV1dPW1heCh4cltpXSwgbXBsW3hsW2ldXSk7CgkJaWYobXByLmZpbmQoeHJbaV0pPT1tcHIuZW5kKCkpCgkJCW1wclt4cltpXV09eGxbaV07CgkJZWxzZQoJCQltcHJbeHJbaV1dPW1pbih4bFtpXSwgbXByW3hyW2ldXSk7Cgl9CgoJLy9jcmVhdGUgdGhlIGV2ZW50cwoJdmVjdG9yPGV2ZW50PiB2ZTsKCWZvcihhdXRvIGEgOiBtcHIpIHsKCQkvL3hsW2ldID0gYS5zZWNvbmQsIHhyW2ldID0gYS5maXJzdAoJCS8vcmlnaHQgc2VnbWVudCBpIHNob3VsZCBiZSBhY3RpdmUgaW4gW3hsW2ldLCB4cltpXSkKCQkvL2FkZCB0aGlzIHJpZ2h0IHNlZ21lbnQgYXQgdGltZSB4bFtpXQoJCXZlLnB1c2hfYmFjayh7YS5zZWNvbmQsIDEsIGEuZmlyc3R9KTsKCQkvL3JlbW92ZSB0aGlzIHJpZ2h0IHNlZ21lbnQgYXQgdGltZSB4cltpXQoJCXZlLnB1c2hfYmFjayh7YS5maXJzdCwgMiwgYS5maXJzdH0pOwoJfQoJZm9yKGF1dG8gYSA6IG1wbCkgewoJCS8veGxbaV0gPSBhLmZpcnN0LCB4cltpXSA9IGEuc2Vjb25kCgkJLy9xdWVyeSB0aGlzIHNlZ21lbnQgd2hpY2ggZXh0ZW5kcyB0byB4cltpXSBhdCB0aW1lIHhsW2ldCgkJdmUucHVzaF9iYWNrKHthLmZpcnN0LCAzLCBhLnNlY29uZH0pOwoJfQoJc29ydCh2ZS5iZWdpbigpLCB2ZS5lbmQoKSk7CgkKCS8vc3dlZXAKCWxsIGFucz0wOwoJLy9kYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgYWN0aXZlIHJpZ2h0IHNlZ21lbnRzCglvc2V0PGludD4gczsKCWZvcihldmVudCBlIDogdmUpIHsKCQlpZihlLnR5cGU9PTEpIHsKCQkJLy9hZGQgc2VnbWVudAoJCQlzLmluc2VydChlLnkpOwoJCX0gZWxzZSBpZihlLnR5cGU9PTIpIHsKCQkJLy9yZW1vdmUgc2VnbWVudAoJCQlzLmVyYXNlKGUueSk7CgkJfSBlbHNlIHsKCQkJLy9sZWZ0IHNlZ21lbnQgaSBpbnRlcnNlY3RzIHJpZ2h0IHNlZ21lbnQgaiBpZiB4cltqXSA8PSB4cltpXQoJCQkvL2NvdW50IHJpZ2h0IHNlZ21lbnRzIDw9IGUueQoJCQlhbnMrPXMub3JkZXJfb2Zfa2V5KGUueSsxKTsKCQl9Cgl9Cgljb3V0IDw8IGFucysxIDw8ICJcbiI7Cn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOwoKCWludCB0OwoJY2luID4+IHQ7Cgl3aGlsZSh0LS0pCgkJc29sdmUoKTsKfQ==