#include <bits/stdc++.h>
#ifdef LOCAL_DEBUG
#define DEBUG 1
#define CERR if(DEBUG) cerr
#define MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NAME,...) NAME
#define pr(...) CERR<<MACRO(__VA_ARGS__,pr10,pr9,pr8,pr7,pr6,pr5,pr4,pr3,pr2,pr1)(__VA_ARGS__)<<endl
#define pr1(a) (#a)<<"="<<(a)<<" "
#define pr2(a,b) pr1(a)<<pr1(b)
#define pr3(a,b,c) pr1(a)<<pr2(b,c)
#define pr4(a,b,c,d) pr1(a)<<pr3(b,c,d)
#define pr5(a,b,c,d,e) pr1(a)<<pr4(b,c,d,e)
#define pr6(a,b,c,d,e,f) pr1(a)<<pr5(b,c,d,e,f)
#define pr7(a,b,c,d,e,f,g) pr1(a)<<pr6(b,c,d,e,f,g)
#define pr8(a,b,c,d,e,f,g,h) pr1(a)<<pr7(b,c,d,e,f,g,h)
#define pr9(a,b,c,d,e,f,g,h,i) pr1(a)<<pr8(b,c,d,e,f,g,h,i)
#define pr10(a,b,c,d,e,f,g,h,i,j) pr1(a)<<pr9(b,c,d,e,f,g,h,i,j)
#define prArr(a){CERR<<(#a)<<"={";int i=0;for(auto t:(a))CERR<<(i++?", ":"")<<t;CERR<<"}"<<endl;}
#else
#define DEBUG 0
#define pr(...)
#define prArr(a)
#endif
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL<<60)+1e9; // ~ 1.15 * 1e18
const Int mod = 998244353;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int,Int>;
template<class T> T Max(T &a,T b){return a=max(a,b);}
template<class T> T Min(T &a,T b){return a=min(a,b);}
template<class T1, class T2> ostream& operator<<(ostream& o,pair<T1,T2> p){return o<<"("<<p.first<<","<<p.second<<")";}
template<class T1, class T2, class T3> ostream& operator<<(ostream& o,tuple<T1,T2,T3> t){return o<<"("<<get<0>(t)<<","<<get<1>(t)<<","<<get<2>(t)<<")";}
template<class T1, class T2> istream& operator>>(istream& i,pair<T1,T2> &p){return i>>p.first>>p.second;}
template<class T> ostream& operator<<(ostream& o,vector<T> a){Int i=0;for(T t:a)o<<(i++?" ":"")<<t;return o;}
template<class T> istream& operator>>(istream& i,vector<T> &a){for(T &t:a)i>>t;return i;}
//INSERT ABOVE HERE

class Count2D{
public:
  Int n;
  vector<vector<Int> > dat;

  Count2D(){}
  Count2D(Int n_){
    n=1;
    while(n < n_) n*=2;
    dat.resize(2*n-1);
  }

  //n_ := x軸方向に確保する要素の個数
  //xは0 <= x < n_である必要がある。yはいくつでも大丈夫
  Count2D(Int n_,vector<pair<Int,Int> > A){ //x, y
    n=1;
    while(n < n_) n*=2;
    dat.resize(2*n-1);

    for(auto a:A){
      Int x,y; tie(x,y) = a;
      assert(0 <= x && x < n_);
      dat[x+n-1].push_back(y);
    }

    function<void(Int)> init=[&](Int k){
      if(k >= n-1) {sort(dat[k].begin(),dat[k].end());return;}
      init(k*2+1), init(k*2+2);

      const auto &a = dat[k*2+1], &b = dat[k*2+2];
      auto &c = dat[k];
      Int i = 0, j = 0;
      while(i < (Int)a.size() || j < (Int)b.size()){
        if(i == (Int)a.size()) c.push_back(b[j++]);
        else if(j == (Int)b.size()) c.push_back(a[i++]);
        else if(a[i] < b[j]) c.push_back(a[i++]);
        else c.push_back(b[j++]);
      }
    };
    init(0);
  }

  // O(nlog(n))
  void update(Int x, Int y){
    assert(0 <= x && x < n);
    auto insert = [&](vector<Int> &A, Int a){
      A.push_back(a);
      Int idx = (Int)A.size()-1;
      while(idx && A[idx-1] > A[idx]) swap(A[idx-1],A[idx]),idx--;
    };

    x += n-1;
    insert(dat[x], y);
    while(x>0) x=(x-1)/2, insert(dat[x],y);
  }

  Int count(Int x, Int X, Int y, Int Y, Int k, Int l, Int r){
    if(r <= x || X <= l) return 0;
    if(x <= l && r <= X){
      Int a = lower_bound(dat[k].begin(), dat[k].end(), y) - dat[k].begin();
      Int b = upper_bound(dat[k].begin(), dat[k].end(), Y) - dat[k].begin();
      return b - a;
    }
    Int vl=count(x, X, y, Y, k*2+1, l, (l+r)/2);
    Int vr=count(x, X, y, Y, k*2+2, (l+r)/2, r);
    return vl + vr;
  }

  //[x,X)かつ[y,Y)の点の数を求める count(x,X,y,Y,0,0,n)
  // O(log(n) * log(n))
  Int count(Int x, Int X, Int y, Int Y){
    assert(x <= X && y <= Y);
    assert(0 <= x && x <= n);
    assert(0 <= X && X <= n);
    return count(x, X, y, Y, 0, 0, n);
  }
};


Int pow2(Int x){
  static Int mem[300000];
  if(x == 0) return 1;
  if(mem[x] != 0) return mem[x];
  return mem[x] = 2 * pow2(x - 1) % mod;
}

Int add(Int a, Int b){
  a = a % mod + mod;
  b = b % mod + mod;
  return (a + b) % mod;
}

signed main(){
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int N;
  cin>>N;
  vector<P> A(N);
  cin>>A;
  {
    vector<Int> X({-INF, INF}), Y({-INF, INF});
    for(auto p:A){
      X.push_back(p.first);
      Y.push_back(p.second);
    }
    sort(X.begin(), X.end());
    sort(Y.begin(), Y.end());
    vector<P> tmp;
    for(auto p:A){
      Int x, y; tie(x, y) = p;
      x = lower_bound(X.begin(), X.end(), x) - X.begin();
      y = lower_bound(Y.begin(), Y.end(), y) - Y.begin();
      tmp.emplace_back(x, y);
    }
    A = tmp;
  }


  const Int n = N + 10;
  Count2D cnt(n, A);
  Int ans = 0;
  for(auto p:A){
    Int x, y; tie(x, y) = p;
    Int a = cnt.count(x+1, n, y+1, n);
    Int b = cnt.count(0, x, y+1, n);
    Int c = cnt.count(0, x, 0, y);
    Int d = cnt.count(x+1, n, 0, y);
    Int a2 = pow2(a) - 1;
    Int b2 = pow2(b) - 1;
    Int c2 = pow2(c) - 1;
    Int d2 = pow2(d) - 1;
    Int sum = pow2(N-1)-1 + pow2(N-1);
    sum = add(sum, -a2);
    sum = add(sum, -b2);
    sum = add(sum, -c2);
    sum = add(sum, -d2);
    sum = add(sum, -a2*b2);
    sum = add(sum, -b2*c2);
    sum = add(sum, -c2*d2);
    sum = add(sum, -d2*a2);
    ans = add(ans, sum);
  }
  cout<<ans<<endl;

  return 0;
}


Measured memory_bytes: 63728