#include <bits/stdc++.h>
#define syosu(x) fixed<<setprecision(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<double,double> pdd;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<string> vs;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<pll> vpll;
typedef pair<ll,pll> pip;
typedef vector<pip> vip;
const int inf=1<<30;
const ll INF=1ll<<60;
const double pi=acos(-1);
const double eps=1e-9;
const ll mod=998244353;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

class Segment_Tree{
	private:
	int n;
	vi date;
	public:
	Segment_Tree(int n_){
		n=1;
		while(n<n_) n*=2;
		date=vi(2*n-1);
	}
	void Update(int k,int x){
		k+=n-1;
		date[k]+=x;
		while(k>0){
			k=(k-1)/2;
			date[k]=date[k*2+1]+date[k*2+2];
		}
	}
	int Query(int a,int b){
		a+=n-1;b+=n-1;
		int m=0;
		while(a<b){
			if(a%2==0) m+=date[a++];
			if(b%2==0) m+=date[--b];
			a/=2;b/=2;
		}
		return m;
	}
	int Open(int k){return date[k+n-1];}
};

int n;
vp a;
vi b;
vl two;

int main(){
	cin>>n;
	a=vp(n);
	b=vi(n);
	two=vl(n+1,1);
	for(int i=1;i<=n;i++) two[i]=two[i-1]*2%mod;
	for(int i=0;i<=n;i++) two[i]--;
	for(int i=0;i<n;i++) cin>>a[i].first>>a[i].second;
	sort(a.begin(),a.end());
	for(int i=0;i<n;i++) b[i]=a[i].second;
	vi c=b;
	sort(c.begin(),c.end());
	map<int,int> mp;
	for(int i=0;i<n;i++) mp[c[i]]=i;
	for(int i=0;i<n;i++) b[i]=mp[b[i]];
	ll res=two[n]*n%mod;
	Segment_Tree st(n);
	for(int i=0;i<n;i++){
		res=(res-two[i]+mod)%mod;
		res=(res-two[n-i-1]+mod)%mod;
		res=(res-two[b[i]]+mod)%mod;
		res=(res-two[n-b[i]-1]+mod)%mod;
		int t=st.Query(0,b[i]);
		res=(res+two[t])%mod;
		res=(res+two[b[i]-t])%mod;
		res=(res+two[i-t])%mod;
		res=(res+two[n-b[i]-i+t-1])%mod;
		st.Update(b[i],1);
	}
	cout<<res<<endl;
}