← Home
```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)
	}
}
```