# うまく翻訳できなかったのでhttps://yukicoder.me/submissions/1149633 を愚直に人力翻訳 # ACLpyのModintの使い方分からなかった(´;ω;`) from atcoder.lazysegtree import LazySegTree import bisect from sys import stdin input = stdin.readline MOD = 998244353 def rev(x): return pow(x, MOD - 2, MOD) def op(a, b) : return ((a[0] * (1 - a[1]) + b[0] * (1 - b[1])) % MOD, 0) e = (1, 1) def mapping(f, x) : return ((x[0] * f) % MOD, x[1]) def composition(f, g) : return f * g % MOD _id = 1 f34 = 3 * rev(4) % MOD f43 = rev(f34) N = int(input().rstrip()) X = [0 for i in range(N)] Y = [0 for i in range(N)] for i in range(N): X[i], Y[i] = map(int, input().rstrip().split()) zX = sorted(set(X)) zY = sorted(set(Y)) if len(zX) == 1 or len(zY) == 1: print(0) exit() rX = [bisect.bisect_left(zX, x) for x in X] rY = [bisect.bisect_left(zY, y) for y in Y] ans = 0 for _ in range(2): G = [[] for i in range(len(zX))] for i in range(N): G[rX[i]].append(rY[i]) V = [e for i in range(len(zY))] for i in range(N): if rY[i] + 1 < len(zY): V[rY[i] + 1] = (V[rY[i] + 1][0] * f34 % MOD, 1) for i in range(1, len(zY)): V[i] = (V[i-1][0] * V[i][0] % MOD, 1) seg = LazySegTree(op, e, mapping, composition, _id, V) fs = 1 for i in range(len(zX) - 1): for y in G[i]: seg.set(y, (seg.get(y)[0], seg.get(y)[1] * f34 % MOD)) seg.apply(0, y, f34) seg.apply(y+1, len(zY), f43) fs = fs * f34 % MOD all_prd = seg.all_prod() ans += (1 - all_prd[0] - fs) * (zX[i + 1] - zX[i]) % MOD ans %= MOD rX, rY = rY, rX zX, zY = zY, zX for i in range(N): ans = ans * 4 % MOD ans = ans * 2 % MOD print(ans)