#include<bits/stdc++.h>
#define M 1000005
#define P 998244353
#define LL long long
using namespace std;
struct node {
	int x,y;
} s[M];
bool cmpx(node A,node B) {
	return A.x<B.x;
}
bool cmpy(node A,node B) {
	return A.y<B.y;
}
int F2[M];
void Add(LL &x,int y) {
	x+=y;
	if(x<0)x+=P;
	if(x>=P)x-=P;
}
int X[M],n;
struct BIT {
	int C[M];
	void clear() {
		for(int i=1; i<=n; i++)C[i]=0;
	}
	void Add(int x) {
		while(x<=n) {
			C[x]++;
			x+=x&-x;
		}
	}
	int Query(int x) {
		int res=0;
		while(x>0) {
			res+=C[x];
			x-=x&-x;
		}
		return res;
	}
} bit;
int main() {
	cin>>n;
	F2[0]=1;
	for(int i=1; i<=n; i++)F2[i]=F2[i-1]*2%P;
	for(int i=0; i<n; i++) {
		scanf("%d %d",&s[i].x,&s[i].y);
		X[i]=s[i].x;
	}
	sort(X,X+n);
	for(int i=0; i<n; i++)s[i].x=lower_bound(X,X+n,s[i].x)-X+1;
	LL ans=1LL*n*(F2[n]-1)%P;
	for(int i=0; i<n; i++) {
		Add(ans,-(F2[i]-1));
		Add(ans,-(F2[n-1-i]-1));
		Add(ans,-(F2[i]-1));
		Add(ans,-(F2[n-1-i]-1));
	}
	sort(s,s+n,cmpy);
	for(int i=0; i<n; i++) {
		Add(ans,F2[bit.Query(s[i].x)]-1);//<x,<y
		Add(ans,F2[i-bit.Query(s[i].x)]-1);//>x,<y
		bit.Add(s[i].x);
	}
	bit.clear();
	for(int i=n-1; i>=0; i--) {
		Add(ans,F2[bit.Query(s[i].x)]-1);//<x,>y
		Add(ans,F2[n-1-i-bit.Query(s[i].x)]-1);//>x,>y;
		bit.Add(s[i].x);
	}
	cout<<ans<<endl;
	return 0;
}