```go
package main
import (
"bufio"
"fmt"
"os"
)
func modpow(b, e, mod int64) int64 {
var r int64 = 1
for e > 0 {
if e&1 == 1 {
r = r * b % mod
}
b = b * b % mod
e >>= 1
}
return r
}
func modinv(x, mod int64) int64 {
return modpow(x, mod-2, mod)
}
func main() {
in := bufio.NewReader(os.Stdin)
var n, q int
fmt.Fscan(in, &n, &q)
a := make([]int64, n+1)
for i := 1; i <= n; i++ {
fmt.Fscan(in, &a[i])
}
b := make([]int64, n+1)
for i := 1; i <= n; i++ {
fmt.Fscan(in, &b[i])
}
prefixA := make([]int64, n+1)
prefixB := make([]int64, n+1)
for i := 1; i <= n; i++ {
prefixA[i] = prefixA[i-1] + a[i]
prefixB[i] = prefixB[i-1] + b[i]
}
G := prefixA[n]
S := prefixB[n]
const MOD int64 = 998244353
ss := int(S)
fact := make([]int64, ss+1)
fact[0] = 1
for i := 1; i <= ss; i++ {
fact[i] = fact[i-1] * int64(i) % MOD
}
invfact := make([]int64, ss+1)
invfact[ss] = modinv(fact[ss], MOD)
for i := ss - 1; i >= 0; i-- {
invfact[i] = invfact[i+1] * (int64(i) + 1) % MOD
}
psum := make([]int64, ss+2)
for j := 1; j <= ss+1; j++ {
k := j - 1
bin := fact[ss] * invfact[k] % MOD * invfact[ss-k] % MOD
psum[j] = (psum[j-1] + bin) % MOD
}
two_pow := modpow(2, S, MOD)
inv_two_pow := modinv(two_pow, MOD)
for qq := 0; qq < q; qq++ {
var l, r int
fmt.Fscan(in, &l, &r)
A := prefixA[r] - prefixA[l-1]
B := prefixB[r] - prefixB[l-1]
C := S - B
D := G - 2*A
K := D + C + 1
var sum_mod int64
if K > S {
sum_mod = 0
} else if K <= 0 {
sum_mod = two_pow
} else {
kk := int(K)
sum_mod = (psum[ss+1] - psum[kk] + MOD) % MOD
}
ans := sum_mod * inv_two_pow % MOD
fmt.Println(ans)
}
}
```