#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
const int N = 1<<19;
vector<int> vec1[N], vec2[N];
map<int,int> mp1, mp2, mp11, mp22;
int x[N], y[N], cur1, cur2;
int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	long long n, ans = 0;
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
		mp1[x[i]];
		mp2[y[i]];
	}
	for (auto [i, x] : mp1)
		mp11[i] = ++cur1;
	for (auto [i, x] : mp2)
		mp22[i] = ++cur2;
	for (int i=1;i<=n;i++){
		x[i] = mp11[x[i]];
		y[i] = mp22[y[i]];
		vec1[x[i]].push_back(y[i]);
		vec2[y[i]].push_back(x[i]);
	}
	for (int i=1;i<=n;i++){
		sort(begin(vec1[i]), end(vec1[i]));
		sort(begin(vec2[i]), end(vec2[i]));
	}
	for (int i=1;i<=n;i++){
		int u = vec1[x[i]].end() - upper_bound(begin(vec1[x[i]]), end(vec1[x[i]]), y[i]);
		int U = upper_bound(begin(vec1[x[i]]), end(vec1[x[i]]), y[i] - 1) - vec1[x[i]].begin();
		int v = vec2[y[i]].end() - upper_bound(begin(vec2[y[i]]), end(vec2[y[i]]), x[i]);
		int V = upper_bound(begin(vec2[y[i]]), end(vec2[y[i]]), x[i] - 1) - vec2[y[i]].begin();
		ans += 1LL * (U + u) * (v + V);
	}
	cout<<ans<<'\n';
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |