#include #define int long long using namespace std; using Pii = pair; const int N = 2e5 + 5, M = 500, P = 998244353; struct Q { int l, r, id; } w[N]; int q, f[N], I[N], l, r, d = 1, e[N]; int C(int x, int y) { return f[x] * I[y] % P * I[x - y] % P; } void A(int x, int v) { if (v) { d = (d * 2 - C(x - 1, l) + P) % P; } else { d = (d + C(r, x)) % P; } } void D(int x, int v) { if (v) { d = ((P + 1) / 2 * (d + C(x, l + 1) - C(x - 1, l + 1) + P)) % P; } else { d = (d - C(r, x) + P) % P; } } int Qp(int x, int y, int P = ::P) { if (!y) { return 1; } int z = Qp(x, y / 2, P); return z * z % P * (y & 1 ? x : 1) % P; } signed main() { cin.tie(0)->ios::sync_with_stdio(0); cin >> q; for (int i = 1; i <= q; i++) { cin >> w[i].r >> w[i].l; w[i].l--; w[i].r--; w[i].id = i; } for (int i = f[0] = I[0] = I[1] = 1; i < N; i++) { f[i] = f[i - 1] * i % P; if (i > 1) { I[i] = I[P % i] * (-P / i + P) % P; } } for (int i = 1; i < N; i++) { I[i] = I[i] * I[i - 1] % P; } sort(w + 1, w + q + 1, [](Q x, Q y) { return (x.l / M) != (y.l / M) ? (x.l / M < y.l / M) : x.r < y.r; }); for (int i = 1; i <= q; i++) { for (; l > w[i].l; D(l--, 0)) { } for (; r < w[i].r; A(++r, 1)) { } for (; r > w[i].r; D(r--, 1)) { } for (; l < w[i].l; A(++l, 0)) { } e[w[i].id] = d * (Qp(2, w[i].r + 1) + P - 1) % P; } for (int i = 1; i <= q; i++) { cout << e[i] << '\n'; } return 0; } /* */