int n; int a[kMaxN], b[kMaxN], pre[kMaxN], nxt[kMaxN], f[kMaxN]; std::vector<int> vec[kMaxN];
constexprintqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i] >> b[i]; for (int i = 1, j = 0; i <= n; ++i) { for (; b[j] < a[i]; ++j) {} pre[i] = j; } a[n + 1] = b[n + 1] = 2 * n + 1; for (int i = n, j = n + 1; i; --i) { for (; a[j] > b[i]; --j) {} nxt[i] = j; } for (int i = 1; i <= n; ++i) vec[nxt[i]].emplace_back(pre[i] - 1); f[0] = 1; for (int i = 1; i <= n; ++i) { f[i] = 2ll * f[i - 1] % kMod; for (auto j : vec[i]) dec(f[i], f[j]); } std::cout << f[n] << '\n'; }