#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define TASK "D"
const int MOD = 998244353;
int n, dem, ans, s, s2, s3, x, y, z;
int p[2505], q[2505], cnt[2505];
pair<int, pair<int, int>> tong[2505];
map<int, int> mp;
pair<int, int> a[2505];
bool check(int a, int b, int c) {
return a < b + c && b < a + c && c < a + b;
}
void add(int &x, int val) {
x += val;
if (x >= MOD) x %= MOD;
if (x < 0) x += MOD;
}
void sub(int &x, int val) {
x -= val;
if (x >= MOD) x %= MOD;
if (x < 0) x += MOD;
}
int mul(int x, int val) {
return ((x % MOD) * (val % MOD)) % MOD;
}
int add_2(int x, int val) {
return ((x % MOD) + (val % MOD)) % MOD;
}
int sub_2(int x, int val) {
return ((x % MOD) - (val % MOD) + MOD) % MOD;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(TASK".INP", "r")) {
freopen(TASK".INP", "r", stdin);
freopen(TASK".OUT", "w", stdout);
}
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].fi >> a[i].se;
mp[a[i].se] = 1;
}
/// Nén số
int m = 0;
for (auto &it : mp) it.se = ++m;
for (int i = 1; i <= n; i++) a[i].se = mp[a[i].se];
/// Sort để 2 con trỏ
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) {
p[i] = a[i].fi % MOD;
q[i] = a[i].se;
}
/// Xử lý
for (int i = 3; i <= n; i++) {
int sum = p[1],
sum2 = mul(p[1], p[1]),
sum3 = mul(sum2, p[1]);
int k = 1;
cnt[q[1]] = 1;
tong[q[1]].fi = sum;
tong[q[1]].se.fi = sum2;
tong[q[1]].se.se = sum3;
for (int j = 2; j < i; j++) {
if (check(p[i], p[j], p[k])) {
if (k > 1) {
k--;
while (check(p[i], p[j], p[k])) {
cnt[q[k]]++;
x = p[k], y = mul(p[k], p[k]), z = mul(y, p[k]);
add(sum, x);
add(sum2, y);
add(sum3, z);
add(tong[q[k]].fi, x);
add(tong[q[k]].se.fi, y);
add(tong[q[k]].se.se, z);
k--;
}
k++;
}
} else {
while (k < j && !check(p[i], p[j], p[k])) {
cnt[q[k]]--;
x = p[k], y = mul(p[k], p[k]), z = mul(y, p[k]);
sub(sum, x);
sub(sum2, y);
sub(sum3, z);
sub(tong[q[k]].fi, x);
sub(tong[q[k]].se.fi, y);
sub(tong[q[k]].se.se, z);
k++;
}
}
x = add_2(p[i], p[j]);
y = mul(x, x);
z = mul(x, y);
if (q[i] == q[j]) {
/// q[i] = q[j] = q[k]
add(ans, add_2(mul(cnt[q[i]], x), tong[q[i]].fi));
/// q[i] = q[j]; q[i] != q[k]
dem = j - k - cnt[q[i]];
if (dem) {
s = sub_2(sum, tong[q[i]].fi);
s2 = sub_2(sum2, tong[q[i]].se.fi);
add(ans, add_2(mul(dem, y) + mul(mul(2, x), s), s2));
}
} else {
/// q[i] != q[j]; q[i] = q[k]
add(ans, add_2(mul(cnt[q[i]], y) + mul(mul(2, x), tong[q[i]].fi), tong[q[i]].se.fi));
/// q[i] != q[j]; q[j] = q[k]
add(ans, add_2(mul(cnt[q[j]], y) + mul(mul(2, x), tong[q[j]].fi), tong[q[j]].se.fi));
/// q[i] != q[j]; q[i] != q[k]; q[j] != q[k]
dem = j - k - cnt[q[i]] - cnt[q[j]];
if (dem) {
s = sub_2(sub_2(sum, tong[q[i]].fi), tong[q[j]].fi);
s2 = sub_2(sub_2(sum2, tong[q[i]].se.fi), tong[q[j]].se.fi);
s3 = sub_2(sub_2(sum3, tong[q[i]].se.se), tong[q[j]].se.se);
add(ans, add_2(add_2(mul(dem, z), mul(mul(3, y), s)), add_2(mul(mul(3, x), s2), s3)));
}
}
cnt[q[j]]++;
x = p[j], y = mul(x, x), z = mul(x, y);
add(sum, x);
add(sum2, y);
add(sum3, z);
add(tong[q[j]].fi, x);
add(tong[q[j]].se.fi, y);
add(tong[q[j]].se.se, z);
}
for (int j = 1; j < i; j++) cnt[q[j]] = tong[q[j]].fi = tong[q[j]].se.fi = tong[q[j]].se.se = 0;
}
cout << ans;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIFRBU0sgIkQiCgpjb25zdCBpbnQgTU9EID0gOTk4MjQ0MzUzOwoKaW50IG4sIGRlbSwgYW5zLCBzLCBzMiwgczMsIHgsIHksIHo7CmludCBwWzI1MDVdLCBxWzI1MDVdLCBjbnRbMjUwNV07CnBhaXI8aW50LCBwYWlyPGludCwgaW50Pj4gdG9uZ1syNTA1XTsKbWFwPGludCwgaW50PiBtcDsKcGFpcjxpbnQsIGludD4gYVsyNTA1XTsKCmJvb2wgY2hlY2soaW50IGEsIGludCBiLCBpbnQgYykgewogIHJldHVybiBhIDwgYiArIGMgJiYgYiA8IGEgKyBjICYmIGMgPCBhICsgYjsKfQoKdm9pZCBhZGQoaW50ICZ4LCBpbnQgdmFsKSB7CiAgeCArPSB2YWw7CiAgaWYgKHggPj0gTU9EKSB4ICU9IE1PRDsKICBpZiAoeCA8IDApIHggKz0gTU9EOwp9Cgp2b2lkIHN1YihpbnQgJngsIGludCB2YWwpIHsKICB4IC09IHZhbDsKICBpZiAoeCA+PSBNT0QpIHggJT0gTU9EOwogIGlmICh4IDwgMCkgeCArPSBNT0Q7Cn0KCmludCBtdWwoaW50IHgsIGludCB2YWwpIHsKICByZXR1cm4gKCh4ICUgTU9EKSAqICh2YWwgJSBNT0QpKSAlIE1PRDsKfQoKaW50IGFkZF8yKGludCB4LCBpbnQgdmFsKSB7CiAgcmV0dXJuICgoeCAlIE1PRCkgKyAodmFsICUgTU9EKSkgJSBNT0Q7Cn0KCmludCBzdWJfMihpbnQgeCwgaW50IHZhbCkgewogIHJldHVybiAoKHggJSBNT0QpIC0gKHZhbCAlIE1PRCkgKyBNT0QpICUgTU9EOwp9CgpzaWduZWQgbWFpbigpIHsKICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogIGlmIChmb3BlbihUQVNLIi5JTlAiLCAiciIpKSB7CiAgICBmcmVvcGVuKFRBU0siLklOUCIsICJyIiwgc3RkaW4pOwogICAgZnJlb3BlbihUQVNLIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgfQogIGNpbiA+PiBuOwogIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgY2luID4+IGFbaV0uZmkgPj4gYVtpXS5zZTsKICAgIG1wW2FbaV0uc2VdID0gMTsKICB9CgogIC8vLyBOw6luIHPhu5EKICBpbnQgbSA9IDA7CiAgZm9yIChhdXRvICZpdCA6IG1wKSBpdC5zZSA9ICsrbTsKICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFbaV0uc2UgPSBtcFthW2ldLnNlXTsKCiAgLy8vIFNvcnQgxJHhu4MgMiBjb24gdHLhu48KICBzb3J0KGEgKyAxLCBhICsgbiArIDEpOwogIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgcFtpXSA9IGFbaV0uZmkgJSBNT0Q7CiAgICBxW2ldID0gYVtpXS5zZTsKICB9CgogIC8vLyBY4butIGzDvQogIGZvciAoaW50IGkgPSAzOyBpIDw9IG47IGkrKykgewogICAgaW50IHN1bSA9IHBbMV0sCiAgICAgICAgc3VtMiA9IG11bChwWzFdLCBwWzFdKSwKICAgICAgICBzdW0zID0gbXVsKHN1bTIsIHBbMV0pOwogICAgaW50IGsgPSAxOwogICAgY250W3FbMV1dID0gMTsKICAgIHRvbmdbcVsxXV0uZmkgPSBzdW07CiAgICB0b25nW3FbMV1dLnNlLmZpID0gc3VtMjsKICAgIHRvbmdbcVsxXV0uc2Uuc2UgPSBzdW0zOwogICAgZm9yIChpbnQgaiA9IDI7IGogPCBpOyBqKyspIHsKICAgICAgaWYgKGNoZWNrKHBbaV0sIHBbal0sIHBba10pKSB7CiAgICAgICAgaWYgKGsgPiAxKSB7CiAgICAgICAgICBrLS07CiAgICAgICAgICB3aGlsZSAoY2hlY2socFtpXSwgcFtqXSwgcFtrXSkpIHsKICAgICAgICAgICAgY250W3Fba11dKys7CiAgICAgICAgICAgIHggPSBwW2tdLCB5ID0gbXVsKHBba10sIHBba10pLCB6ID0gbXVsKHksIHBba10pOwogICAgICAgICAgICBhZGQoc3VtLCB4KTsKICAgICAgICAgICAgYWRkKHN1bTIsIHkpOwogICAgICAgICAgICBhZGQoc3VtMywgeik7CiAgICAgICAgICAgIGFkZCh0b25nW3Fba11dLmZpLCB4KTsKICAgICAgICAgICAgYWRkKHRvbmdbcVtrXV0uc2UuZmksIHkpOwogICAgICAgICAgICBhZGQodG9uZ1txW2tdXS5zZS5zZSwgeik7CiAgICAgICAgICAgIGstLTsKICAgICAgICAgIH0KICAgICAgICAgIGsrKzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2hpbGUgKGsgPCBqICYmICFjaGVjayhwW2ldLCBwW2pdLCBwW2tdKSkgewogICAgICAgICAgY250W3Fba11dLS07CiAgICAgICAgICB4ID0gcFtrXSwgeSA9IG11bChwW2tdLCBwW2tdKSwgeiA9IG11bCh5LCBwW2tdKTsKICAgICAgICAgIHN1YihzdW0sIHgpOwogICAgICAgICAgc3ViKHN1bTIsIHkpOwogICAgICAgICAgc3ViKHN1bTMsIHopOwogICAgICAgICAgc3ViKHRvbmdbcVtrXV0uZmksIHgpOwogICAgICAgICAgc3ViKHRvbmdbcVtrXV0uc2UuZmksIHkpOwogICAgICAgICAgc3ViKHRvbmdbcVtrXV0uc2Uuc2UsIHopOwogICAgICAgICAgaysrOwogICAgICAgIH0KICAgICAgfQogICAgICB4ID0gYWRkXzIocFtpXSwgcFtqXSk7CiAgICAgIHkgPSBtdWwoeCwgeCk7CiAgICAgIHogPSBtdWwoeCwgeSk7CiAgICAgIGlmIChxW2ldID09IHFbal0pIHsKICAgICAgICAvLy8gcVtpXSA9IHFbal0gPSBxW2tdCiAgICAgICAgYWRkKGFucywgYWRkXzIobXVsKGNudFtxW2ldXSwgeCksIHRvbmdbcVtpXV0uZmkpKTsKICAgICAgICAvLy8gcVtpXSA9IHFbal07IHFbaV0gIT0gcVtrXQogICAgICAgIGRlbSA9IGogLSBrIC0gY250W3FbaV1dOwogICAgICAgIGlmIChkZW0pIHsKICAgICAgICAgIHMgPSBzdWJfMihzdW0sIHRvbmdbcVtpXV0uZmkpOwogICAgICAgICAgczIgPSBzdWJfMihzdW0yLCB0b25nW3FbaV1dLnNlLmZpKTsKICAgICAgICAgIGFkZChhbnMsIGFkZF8yKG11bChkZW0sIHkpICsgbXVsKG11bCgyLCB4KSwgcyksIHMyKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vLyBxW2ldICE9IHFbal07IHFbaV0gPSBxW2tdCiAgICAgICAgYWRkKGFucywgYWRkXzIobXVsKGNudFtxW2ldXSwgeSkgKyBtdWwobXVsKDIsIHgpLCB0b25nW3FbaV1dLmZpKSwgdG9uZ1txW2ldXS5zZS5maSkpOwogICAgICAgIC8vLyBxW2ldICE9IHFbal07IHFbal0gPSBxW2tdCiAgICAgICAgYWRkKGFucywgYWRkXzIobXVsKGNudFtxW2pdXSwgeSkgKyBtdWwobXVsKDIsIHgpLCB0b25nW3Fbal1dLmZpKSwgdG9uZ1txW2pdXS5zZS5maSkpOwogICAgICAgIC8vLyBxW2ldICE9IHFbal07IHFbaV0gIT0gcVtrXTsgcVtqXSAhPSBxW2tdCiAgICAgICAgZGVtID0gaiAtIGsgLSBjbnRbcVtpXV0gLSBjbnRbcVtqXV07CiAgICAgICAgaWYgKGRlbSkgewogICAgICAgICAgcyA9IHN1Yl8yKHN1Yl8yKHN1bSwgdG9uZ1txW2ldXS5maSksIHRvbmdbcVtqXV0uZmkpOwogICAgICAgICAgczIgPSBzdWJfMihzdWJfMihzdW0yLCB0b25nW3FbaV1dLnNlLmZpKSwgdG9uZ1txW2pdXS5zZS5maSk7CiAgICAgICAgICBzMyA9IHN1Yl8yKHN1Yl8yKHN1bTMsIHRvbmdbcVtpXV0uc2Uuc2UpLCB0b25nW3Fbal1dLnNlLnNlKTsKICAgICAgICAgIGFkZChhbnMsIGFkZF8yKGFkZF8yKG11bChkZW0sIHopLCBtdWwobXVsKDMsIHkpLCBzKSksIGFkZF8yKG11bChtdWwoMywgeCksIHMyKSwgczMpKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNudFtxW2pdXSsrOwogICAgICB4ID0gcFtqXSwgeSA9IG11bCh4LCB4KSwgeiA9IG11bCh4LCB5KTsKICAgICAgYWRkKHN1bSwgeCk7CiAgICAgIGFkZChzdW0yLCB5KTsKICAgICAgYWRkKHN1bTMsIHopOwogICAgICBhZGQodG9uZ1txW2pdXS5maSwgeCk7CiAgICAgIGFkZCh0b25nW3Fbal1dLnNlLmZpLCB5KTsKICAgICAgYWRkKHRvbmdbcVtqXV0uc2Uuc2UsIHopOwogICAgfQogICAgZm9yIChpbnQgaiA9IDE7IGogPCBpOyBqKyspIGNudFtxW2pdXSA9IHRvbmdbcVtqXV0uZmkgPSB0b25nW3Fbal1dLnNlLmZpID0gdG9uZ1txW2pdXS5zZS5zZSA9IDA7CiAgfQogIGNvdXQgPDwgYW5zOwogIHJldHVybiAwOwp9Cg==