#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define int long long
#define F first
#define S second
#define P pair
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,a,b) for(int i=a;i<b;i++)
#define V vector
#define RE return
#define ALL(a) a.begin(),a.end()
#define MP make_pair
#define PB push_back
#define PF push_front
#define FILL(a,b) memset(a,b,sizeof(a))
using namespace std;
int n,mod= 998244353;
class node{
    public:
    int bit[200005];
    int get(int p){
        int re=0;
        while(p){
            re+=bit[p];
            p-=p&(-p);
        }
        RE re;
    }
    void add(int p,int x){
        while(p<=n){
            bit[p]+=x;
            p+=p&(-p);
        }
    }
};
node tree1,tree2;
struct data{
    int x,y,id;
};
data a[200005];
P<int,int> num[200005];
bool cmp(data s1,data s2){RE s1.x<s2.x;}
int pow2(int p){
    int s=2,re=1;
    while(p){
        if(p&1)re=re*s%mod;
        s=s*s%mod;
        p=p/2;
    }
    RE re;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
    FOR(i,1,n){
        cin>>a[i].x>>a[i].y;
        num[i].S=i;
        num[i].F=a[i].y;
    }
    sort(num+1,num+n+1);
    FOR(i,1,n)a[num[i].S].id=i;
    sort(a+1,a+n+1,cmp);
    int ans=0;
    FOR(i,1,n)tree2.bit[i]=i&(-i);
    int A,B,C,D;
    FOR(i,1,n){
        tree2.add(a[i].id,-1);
        A=pow2(tree1.get(a[i].id));
        B=pow2(tree1.get(n)-tree1.get(a[i].id));
        C=pow2(tree2.get(a[i].id));
        D=pow2(tree2.get(n)-tree2.get(a[i].id));
        tree1.add(a[i].id,1);
        ans=(ans+(A-1)*B%mod*C%mod*(D-1))%mod;
        ans=(ans+A*(B-1)%mod*(C-1)%mod*D)%mod;
        ans=(ans-(A-1)*(B-1)%mod*(C-1)%mod*(D-1)%mod+mod)%mod;
        ans=(ans+pow2(n-1))%mod;
    }
    cout<<ans;
	RE 0;
}

