class SegmentTree: def __init__(self, v,marge,default=0): self.default = default self.marge = marge self.lastnode = 1 while self.lastnode < len(v): self.lastnode*=2 #1-indexedで作成する self.array = [self.default] *(2*self.lastnode) for i in range(len(v)): self.array[self.lastnode+i] = v[i] for i in range(self.lastnode-1,-1,-1): self.array[i] = self.marge(self.array[2*i],self.array[2*i+1]) def update(self,x,val): x += self.lastnode self.array[x] = val while x>0: x >>=1 self.array[x] = self.marge(self.array[2*x],self.array[2*x+1]) def get(self,q_left,q_right): q_left += self.lastnode q_right += self.lastnode lres,rres = self.default,self.default while q_left < q_right: if q_left&1: lres = self.marge(lres,self.array[q_left]) q_left += 1 if q_right&1: q_right -= 1 rres = self.marge(self.array[q_right],rres) q_left >>= 1 q_right>>= 1 return self.marge(lres,rres) def __getitem__(self,x): x += self.lastnode return self.array[x] def binary_search(self,val): if self.array[1] < val: return -1 i = 2 now = 0 while i < 2*self.lastnode: if self.marge(now,self.array[i]) >1) - self.lastnode N,M,Q = map(int,input().split()) def merge(x,y): return ((x[0]*pow(M,y[1],998244353)%998244353+y[0])%998244353,x[1]+y[1]) A = list(map(int,input().split())) V = [(a-1,1) for a in A] st = SegmentTree(V,merge,(0,0)) for i in range(Q): l,r = map(int,input().split()) l-=1 print((st.get(l,r)[0]+1)%998244353)