func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long mod = 998244353;   const int maxn = 300009;   long long fac[maxn], invfac[maxn], A[33], B[33], in[maxn], idx[maxn];   vector<int> L[maxn], R[maxn];   int n, m;   long long mpw(long long a, long long b) {     long long c = 1;     while (b) {       if (b & 1ll) c = c * a % mod;       a = a * a % mod;       b >>= 1;     }     return c;   }   void init() {     fac[0] = 1;     for (int i = 1; i < maxn; ++i) fac[i] = fac[i - 1] * i % mod;     invfac[maxn - 1] = mpw(fac[maxn - 1], mod - 2);     for (int i = maxn - 2; i >= 0; --i) invfac[i] = invfac[i + 1] * (i + 1) % mod;   }   long long C(int a, int b) {     if (a < b || b < 0) return 0;     return fac[a] * invfac[b] % mod * invfac[a - b] % mod;   };   int main() {     ios_base::sync_with_stdio(false), cout.tie(0), cin.tie(0);     cin >> n >> m;     vector<std::vector<int>> add(n + 1), del(n + 1);     for (int i = 1; i <= n; ++i) {       int l, r;       cin >> l >> r;       L[l].push_back(i);       R[r].push_back(i);       add[l].push_back(i - 1);       del[r].push_back(i - 1);     }     int idxtot = 0, cc = 0;     memset(idx, -1, sizeof idx);     std::vector<int> a(m), b(m);     std::vector<int> id(n, -1);     for (int i = 0; i < m; ++i) {       cin >> A[i] >> B[i];       a[i] = A[i] - 1;       b[i] = B[i] - 1;       if (idx[A[i]] == -1) idx[A[i]] = idxtot++;       if (idx[B[i]] == -1) idx[B[i]] = idxtot++;       if (id[a[i]] == -1) id[a[i]] = cc++;       if (id[b[i]] == -1) id[b[i]] = cc++;     }     init();     long long premask = 0, tot = 0, masktot = 0, curmask = 0, res = 0;     vector<long long> cnt(m + 1);     cnt[0] = 1;     std::vector<int> ways(m + 1);     std::vector<int> in2(n);     ways[0] = 1;     long long mask = 0;     int tot2 = 0, tp = 0;     int ans = 0;     for (int i = 1; i <= n; ++i) {       for (int j : L[i]) {         in[j] = 1;         if (idx[j] == -1)           tot++;         else           masktot++;       }       for (auto x : add[i]) {         in2[x] = 1;         ++(id[x] == -1 ? tot2 : tp);       }       curmask = 0;       for (int j = 0; j < m; ++j) {         if (in[A[j]]) curmask |= 1ll << idx[A[j]];         if (in[B[j]]) curmask |= 1ll << idx[B[j]];       }       long long nMask = 0;       for (int j = 0; j < m; ++j) {         if (in2[a[j]]) nMask |= 1ll << id[a[j]];         if (in2[b[j]]) nMask |= 1ll << id[b[j]];       }       if (nMask != curmask) {         cout << 1 <<   n ;         return 0;       }       if (mask != premask) {         cout << 3;         return 0;       }       if (tp != masktot) {         cout << 4;         return 0;       }       if (nMask != mask) {         mask = nMask;         std::fill(ways.begin(), ways.end(), 0);         std::function<void(int, int64_t, int)> dfs1 = [&](int x, int64_t s,                                                           int coef) {           if (x == m) {             int p = __builtin_popcountll(s);             for (int j = 0; j <= m; ++j)               ways[j] = (ways[j] + 1ll * coef * C(tp - p, j - p)) % mod;             return;           }           if (in2[a[x]] && in2[b[x]])             dfs1(x + 1, s | 1ll << id[a[x]] | 1ll << id[b[x]], mod - coef);           dfs1(x + 1, s, coef);         };         dfs1(0, 0, 1);       }       if (premask != curmask) {         for (int j = 0; j <= m; ++j) cnt[j] = 0;         std::function<void(int, int64_t, int)> dfs1 = [&](int x, int64_t s,                                                           int coef) {           if (x == m) {             int p = __builtin_popcountll(s);             for (int j = 0; j <= m; ++j)               cnt[j] = (cnt[j] + 1ll * coef * C(tp - p, j - p)) % mod;             return;           }           if (in[A[x]] && in[B[x]])             dfs1(x + 1, s | 1ll << idx[A[x]] | 1ll << idx[B[x]], mod - coef);           dfs1(x + 1, s, coef);         };         dfs1(0, 0, 1);       }       premask = curmask;       for (int j = 0; j <= m; ++j)         if (cnt[j] != ways[j]) {           for (int x = 0; x < n; ++x) assert(in[x + 1] == in2[x]);           cout << 2;           return 0;         }       for (int j = 0; j <= m; ++j)         ans = (ans + 1ll * ways[j] * C(tot2, i - j)) % mod;       for (int j = 0; j <= m; ++j)         res = (res + cnt[j] * C(tot, i - j) % mod) % mod;       assert(ans == res);       for (int j : R[i]) {         in[j] = 0;         if (idx[j] == -1)           tot--;         else           masktot--;       }       for (auto x : del[i]) {         in2[x] = 0;         --(id[x] == -1 ? tot2 : tp);       }     }     cout << res;     return 0;   }   