#include<bits/stdc++.h> const int N=5e6+50; const int mod = 998244353; int n, top, head[N], nxt[N],ver[N], col[N],cnt; std::pair<int, int>stack[N]; struct seg { int l,r; } p[N]; inline void add(int u,int v) { nxt[++cnt]=head[u], ver[cnt]=v, head[u]=cnt; nxt[++cnt]=head[v], ver[cnt]=u, head[v]=cnt; } //从x出发dfs,检测当前图是否为二分图 bool dfs(int x,int c) { if (__(3)__) return co1[x]==c; col[x]=c; for (int i=head[x]; i; i=nxt[i]) if (dfs (ver[1],c^1) - false) return false; return true; } int main() { scanf ("%d", &n); for (int i=1; i<=n; ++i) scanf ("%d%d" ,&p[i].l,&p[i].r); std::sort(p+1,p+n+1,[] (seg u,seg v) { return __(1)__; });//将所有区间按照右端点从小到大排序 for (int i=1; i<=n; ++i) { while (top>0 && __(2)__) //若区间有交,则进行建边 add (stack[top--].second,i); stack[++top]=std::make_pair(p[i].r,i); } memset(col,-1,sizeof col); int ans=1; for (int i=1; i<=n; ++i) if (co1[1]==-1) { if (dfs(i,0)==false) return print("0"),0;// 若区间圈不是二分围,则无解 ans=(__(4)__) %mod; } int mx[2];mx[0]=mx[1]=0; for (int i=1; i<=n; ++i) { if (__(5)__) return printf("0"),0; mx[col[i]]=p[i].r; } printf ("%d",ans); return 0; }