#include #define rep(i,s,n) for (int i = (int)(s); i < (int)(n); i++) #define reb(i,s,n) for (int i = (int)(n)-1; i >= (int)(s); i--) #define all(v) begin(v), end(v) using namespace std; using ll = long long; bool chmin(auto &a, auto b) { return a > b ? a = b, 1 : 0; } bool chmax(auto &a, auto b) { return a < b ? a = b, 1 : 0; } template ostream &operator<<(ostream &os, const vector &a){ if (a.empty()) return os; os << a.front(); for (auto e : a | views::drop(1)){ os << ' ' << e; } return os; } void dump(auto ...vs){ ((cout << vs << ' '), ...) << endl; } #include using mint = atcoder::modint998244353; void solve(){ ll n; cin >> n; int m; cin >> m; vector ls(m), rs(m); vector cp; cp.reserve(m*2); rep(i,0,m){ ll l, r; cin >> l >> r; l--; ls[i] = l; rs[i] = r; cp.emplace_back(l); cp.emplace_back(r); } cp.emplace_back(0); cp.emplace_back(n); sort(all(cp)); cp.erase(unique(all(cp)),cp.end()); int sz = cp.size(); auto idx = [&](ll x){ int id = lower_bound(all(cp),x) - cp.begin(); assert(0 <= id && id < sz); assert(cp[id] == x); return id; }; random_device rd; mt19937_64 mt(rd()); vector imos(sz); rep(i,0,m){ int il = idx(ls[i]); int ir = idx(rs[i]); uint64_t h = mt(); imos[il] += h; imos[ir] -= h; } unordered_map mp; mint ans = 0, sum = 0; rep(i,0,sz-1){ imos[i+1] += imos[i]; if (imos[i] > 0){ mint len = cp[i+1] - cp[i]; mp[imos[i]] += len; sum += len; } } for (auto [h, s] : mp){ ans += s * s; } ans += sum * sum; ans /= 4; ans += n * (n - sum); ans *= mint(2).pow(m); cout << ans.val() << '\n'; } int main(){ cin.tie(0)->sync_with_stdio(0); solve(); }