""" Left Addition Machine 想定TLE解 2 間に、A[i-1] >= A[i] となるi-1,iが存在する場合だけ線形 """ import sys from sys import stdin def rangesum(arr,l,r): #[l:r] (0-indexed) の和を取る arrはあらかじめ累積和しておくこと if l == 0: return arr[r] else: return arr[r] - arr[l-1] mod = 998244353 #入力を受け取る N,Q = map(int,stdin.readline().split()) A = list(map(int,stdin.readline().split())) LR = [] for i in range(Q): L,R = map(int,stdin.readline().split()) LR.append( (L,R) ) #制約チェック assert 1 <= N <= 2*(10**5) assert 1 <= Q <= 2*(10**5) assert len(A) == N assert len(LR) == Q for i in range(N): assert 0 <= A[i] < mod for i in range(Q): L,R = LR[i] assert 1 <= L <= R <= N #A[0:r) までの場合を計算 fst = [] #fst[i] = A[0:r) までを入れた場合の結果 fnew = [0] * N #A[i-1] >= A[i] ならば fnew[i] = 1とする。 for i in range(N): if i == 0 or A[i-1] >= A[i]: fst.append(A[i]) fnew[i] = 1 pw = 1 else: fst.append( (fst[-1] + pw * A[i]) % mod ) pw *= 2 pw %= mod #fnewの累積和を取っておく for i in range(N-1): fnew[i+1] += fnew[i] powtwo = [1] #2^i を前計算 invtwo = [1] #1/2^i を前計算 half = pow(2,mod-2,mod) #1/2 (mod 998244353) for i in range(N): powtwo.append(powtwo[-1] * 2 % mod) invtwo.append(invtwo[-1] * half % mod) CS = [A[i] * powtwo[i] % mod for i in range(N)] #解説の配列Cの累積和 for i in range(N-1): #累積和を取る CS[i+1] += CS[i] ANS = [] for loop in range(Q): #クエリを処理 l,r = LR[loop] l -= 1 #0-indexedにする r -= 1 if fnew[l] != fnew[r]: #間に、A[i-1] >= A[i] となるi-1,iが存在する #ANS.append( fst[r] % mod ) """ 変更箇所はこの辺。線形になっている。 """ ans = 0 for i in range(r,l-1,-1): if A[i-1] >= A[i]: ans += A[i] ans %= mod break else: ans *= 2 ans += A[i] ans %= mod ANS.append(ans) else: ANS.append( (A[l] + rangesum(CS,l+1,r) * invtwo[l+1]) % mod ) print ("\n".join(map(str,ANS)))