#include #define int long long int using namespace std; const int MAXN = 2e5 + 5, mod = 998244353; int T, inv[MAXN], jc[MAXN], n, m, id[MAXN], ans[MAXN], last = 1, l, r, inv_2; struct Node { int x, y, pos; }ls[MAXN]; int KSM(int a, int b) { int sum = 1; while (b) { if (b & 1) sum *= a, sum %= mod; a *= a, a %= mod; b >>= 1; } return sum; } void ycl() { jc[0] = inv[0] = 1; for (int i = 1; i <= MAXN - 5; i++) jc[i] = jc[i - 1] * i % mod, inv[i] = KSM(jc[i], mod - 2); } int C(int a, int b) { return jc[a] * inv[b] % mod * inv[a - b] % mod; } void MKFK() { int kc = cbrt(MAXN); for (int i = 0; i <= MAXN - 5; i++) id[i] = (i - 1) / kc + 1; } bool cmp(Node x, Node y) { if (id[x.x] != id[y.x]) return id[x.x] < id[y.x]; return x.y < y.y; } void add(int x, int op) { // if (op) cout << l << ' ' << r << ';'; if (op == 0) last = (last * 2 % mod - C(l, r) + mod) % mod; else last = (last + C(l, r + 1)) % mod; } void del(int x, int op) { if (op == 0) last = ((last + C(l, r)) % mod * inv_2) % mod; else last = (last - C(l, r) + mod) % mod; } signed main() { ios::sync_with_stdio(false); cin.tie(0); ycl(); inv_2 = KSM(2, mod - 2); cin >> T; for (int i = 1; i <= T; i++) { cin >> ls[i].x >> ls[i].y; ls[i].x --, ls[i].y --; ls[i].pos = i; } MKFK(); sort(ls + 1, ls + 1 + T, cmp); for (int i = 1; i <= T; i++) { while (l < ls[i].x) add(l, 0), l++; // cout << last << ' '; while (l > ls[i].x) del(l, 0), l--; // l = ls[i].x; while (r < ls[i].y) add(r, 1), r++; while (r > ls[i].y) del(r, 1), r--; ans[ls[i].pos] = (KSM(2, ls[i].x + 1) - 1) * last % mod; } for (int i = 1; i <= T; i++) { cout << ans[i] << '\n'; } return 0; } /* C(n, 0) + C(n, 1) + C(n, 2) + C(n, 3) + ... + C(n, m) C(n + 1, 0) + C(n + 1, 1) + C(n + 1, 2) + C(n + 1, 3) + ... + C(n + 1, m) = C(n, 0) + (C(n, 0) + C(n, 1)) + (C(n, 1) + C(n, 2)) + ... + (C(n, m - 1) + C(n, m)) = 2 * last - C(n, m) 1 4 3 C(4, 0) + C(4, 1) */