#include<bits/stdc++.h>
using namespace std;
const int M=200001,P=998244353;
int n,len,B[M<<1],tot,ans;
int Pow[M];
struct node{
	int x,y;
}A[M];
bool comp1(node a,node b){
	return a.x<b.x;
}
bool comp2(node a,node b){
	return a.y<b.y;
}
bool comp(node a,node b){
	return a.x<b.x;
}
int C1[M<<1],C2[M<<1];
int query_litte(int x){
	int res=0;
	while(x){
		res+=C1[x];
		if(res>=P)res-=P;
		x-=x&-x;
	}
	return res;
}
int query_large(int x){
	int res=0;
	while(x<=tot){
		res+=C2[x];
		if(res>=P)res-=P;
		x+=x&-x;
	}
	return res;
}
void add_litte(int x){
	while(x<=tot){
		C1[x]++;
		x+=x&-x;
	}
}
void add_large(int x){
	while(x){
		C2[x]++;
		x-=x&-x;
	}
}
int main(){
	scanf("%d",&n);
	Pow[0]=1;
	for(int i=1;i<=n;i++)Pow[i]=Pow[i-1]*2%P;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&A[i].x,&A[i].y);
		B[++tot]=A[i].x,B[++tot]=A[i].y;
	}
	sort(B+1,B+tot+1);
	len=unique(B+1,B+tot+1)-B-1;
	for(int i=1;i<=n;i++){
		A[i].x=lower_bound(B+1,B+len+1,A[i].x)-B;
		A[i].y=lower_bound(B+1,B+len+1,A[i].y)-B;
	}
	ans=n*1ll*(Pow[n]-1)%P;
	for(int i=1;i<=n;i++){
		ans=(ans-(Pow[i-1]-1)+P)%P;
		ans=(ans-(Pow[i-1]-1)+P)%P;
		ans=(ans-(Pow[n-i]-1)+P)%P;
		ans=(ans-(Pow[n-i]-1)+P)%P;
	}
	sort(A+1,A+n+1,comp);
	for(int i=1;i<=n;i++){
		ans=(ans+Pow[query_litte(A[i].y)]-1)%P;
		add_litte(A[i].y);
		ans=(ans+Pow[query_large(A[i].y)]-1)%P;
		add_large(A[i].y);
	}
	memset(C1,0,sizeof(C1));
	memset(C2,0,sizeof(C2));
	for(int i=n;i>=1;i--){
		ans=(ans+Pow[query_litte(A[i].y)]-1)%P;
		add_litte(A[i].y);
		ans=(ans+Pow[query_large(A[i].y)]-1)%P;
		add_large(A[i].y);
	}
	printf("%d\n",ans);
}