MOD = 998244353 def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) idx +=1 Q = int(data[idx]) idx +=1 a = [] b = [] for _ in range(N): ai = int(data[idx]) idx +=1 bi = int(data[idx]) idx +=1 a.append(ai) b.append(bi) queries = [] for _ in range(Q): l = int(data[idx]) idx +=1 r = int(data[idx]) idx +=1 p = int(data[idx]) idx +=1 x = int(data[idx]) idx +=1 queries.append( (l, r, p, x) ) size = 1 while size < N: size <<=1 tree = [ (1,0) for _ in range(2*size) ] for i in range(N): ai = a[i] bi = b[i] tree[size + i] = (ai % MOD, bi % MOD) for i in range(size-1, 0, -1): a_left, b_left = tree[2*i] a_right, b_right = tree[2*i +1] a_total = (a_right * a_left) % MOD b_total = (a_right * b_left + b_right) % MOD tree[i] = (a_total, b_total) def query(l, r): res_a = 1 res_b = 0 l += size r += size while l < r: if l % 2 ==1: a_tmp, b_tmp = tree[l] res_a = (res_a * a_tmp) % MOD res_b = (res_a * res_b + res_b * a_tmp + b_tmp) % MOD res_b = (res_a * res_b + b_tmp) % MOD l +=1 if r %2 ==1: r -=1 a_tmp, b_tmp = tree[r] res_a = (res_a * a_tmp) % MOD res_b = (res_a * res_b + b_tmp) % MOD l >>=1 r >>=1 return (res_a, res_b) for l, r, p, x in queries: if l >= r: print(x % MOD) continue res_a = 1 res_b = 0 current_a = 1 current_b = 0 for k in range(l, r): i = k ^ p if i >= N: continue ai = a[i] bi = b[i] current_a = (ai * current_a) % MOD current_b = (ai * current_b + bi) % MOD res = (current_a * x + current_b) % MOD print(res) if __name__ == '__main__': main()