#include using namespace std; #define rep(i, j, k) for (register int i = j; i <= k; ++i) #define per(i, j, k) for (register int i = j; i >= k; --i) #define sz(x) (int)x.size() const long long mod = 998244353; using i64 = long long; using u64 = unsigned long long; using u32 = unsigned; using pii = pair; using pll = pair; #define int i64 mt19937_64 rng((u64)random_device {}() << 32 ^ random_device {}() ^ chrono::high_resolution_clock::now().time_since_epoch().count()); templateT rnd(T l,T2 r) { return uniform_int_distribution(l,r)(rng); } const int N = 2e5 + 10; i64 fac[N], ifac[N], sc[N]; i64 qpow(i64 a, int b, i64 res = 1) { for (; b > 0; b >>= 1, a = a * a % mod) if (b & 1) res = res * a % mod; return res; } void init(int n = 2e5) { fac[0] = ifac[0] = sc[0] = 1; rep (i, 1, n) fac[i] = fac[i - 1] * i % mod, ifac[i] = qpow(fac[i], mod - 2), sc[i] = sc[i - 1] + qpow(2, i), sc[i] %= mod; } i64 comb(int n, int k) { if (k > n || n < 0 || k < 0) return 0; return fac[n] * ifac[k] % mod * ifac[n - k] % mod; } int ans[N]; template class split { public: //private: vector a; vector l, r, col; int n, B; T operator [](int i) const {return a[i];} int getid(int i) {return col[i];} int lft(int i) {return l[i];} int rig(int i) {return r[i];} split(int _n, T x = T(), int _B = 0) { a.resize(_n + 1, x); n = _n; col.resize(n + 1), l.resize(n + 1), r.resize(n + 1); if (_B == 0) _B = max((i64)sqrtl(_n), 1LL); B = _B; rep (i, 1, n) { col[i] = (i - 1) / B + 1; if (!l[col[i]]) l[i] = i; r[col[i]] = i; } } void insert(int i, T x) { a[i] = x; } bool cmp(T x, T y) { if (col[x[0]] != col[y[0]]) return col[x[0]] < col[y[0]]; return x[1] < y[1]; } void sort() { sort(a.begin() + 1, a.begin() + n + 1, cmp); } }; int norm(int p) { p = (p % mod + mod) % mod; return p; } signed main(int argc, char* argv[]) { // freopen(".in", "r", stdin); // freopen(".out", "w", stdout); ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); init(); int q; cin >> q; split> s(q + 1); rep (i, 1, q) { int x, y; cin >> x >> y; s.insert(i, (array){y - 1, x - 1, i}); } sort(s.a.begin() + 1, s.a.begin() + q + 1); int inv = qpow(2, mod - 2); for (int i = 1, l = 0, r = 1, res = 1; i <= q; ++i) { int x = s[i][0], y = s[i][1]; // cout << x << ' ' << y << '\n'; while (l > x) res = norm(res - comb(r, l)), l--; while (l < x) l++, res = norm(res + comb(r, l)); while (r > y) r--, res = (res + comb(r, l)) % mod * inv % mod; while (r < y) res = norm(res * 2 - comb(r, l)), r++; ans[s[i][2]] = res * sc[y] % mod; } rep (i, 1, q) cout << ans[i] << '\n'; }