import sys ni = lambda :int(input()) na = lambda :list(map(int,input().split())) yes = lambda :print("yes");Yes = lambda :print("Yes");YES = lambda : print("YES") no = lambda :print("no");No = lambda :print("No");NO = lambda : print("NO") ####################################################################### class DualSegmentTree: def __init__(self, size, f, default): self.n = (size-1).bit_length() self.size = 1<>i) def update(self, a, b, x): a += self.size b += self.size-1 self.thrust(a) self.thrust(b) l = a r = b + 1 lazy = self.lazy while l < r: if l & 1: lazy[l] = self.f(lazy[l], x) l += 1 if r & 1: r -= 1 lazy[r] = self.f(lazy[r], x) l >>= 1 r >>= 1 def get(self, k): k += self.size self.thrust(k) return self.lazy[k] n, b, q = na() k = 101 def op(x, y): return [(x[i] + y[i]) % b for i in range(k)] a = DualSegmentTree(n, op, [0] * k) def get(m): z = 1 r = 0 res = a.get(m) for i in range(k): r = (r + z * res[i]) % b z = m * z % b return r for _ in range(q): l, m, r, c, d = na() l -= 1 m -= 1 c += 1 f = [0] * k f[0] = 1 for i in range(d): nf = [0] * k for j in range(i + 1): nf[j + 1] = (nf[j+1] + f[j]) % b nf[j] = (nf[j] + f[j] * c) % b f = nf # print(f) # print(f) a.update(l, r, f) res = a.get(m) print(get(m))