R=range class BIT: def __init__(self,x): if isinstance(x,int): self.N=x self.F=[0]*(x+1) else: self.N=len(x) self.F=[0]*(self.N+1) for j in R(1,self.N+1): i=j-1 self.F[j]=x[i] k=j-(j&-j) while i>k: self.F[j]+=self.F[i] i-=i&-i def Add(self,i,u): i+=1 while i<=self.N: self.F[i]+=u i+=i&-i def InitialSegmentSum(self,r): assert(r>-2) a=0 i=min(r+1,self.N) while i: a+=self.F[i] i-=i&-i return a class IntervalAddBIT: def __init__(self,N): self.N=N self.F=BIT(N+1) self.G=BIT(N+1) def IntervalAdd(self,l,r,u): self.F.Add(l,-(l-1)*u%B) self.F.Add(r+1,r*u%B) self.G.Add(l,u) self.G.Add(r+1,-u) def InitialSegmentSum(self,r): return self.F.InitialSegmentSum(r)+r*self.G.InitialSegmentSum(r) def IntervalSum(self,l,r): return self.InitialSegmentSum(r)-self.InitialSegmentSum(l-1) J=lambda:map(int,input().split()) N,B,Q=J() c=[] for d in R(101):c+=[[1]+[sum(c[-1][j:j+2])%B for j in R(d)]] A=[IntervalAddBIT(N)for d in R(101)] for _ in R(Q): L,M,U,C,D=J() p=1 for d in R(D,-1,-1):A[d].IntervalAdd(L-1,U-1,c[D][d]*p%B);p=p*C%B a,p=0,1 for d in R(101):a+=A[d].IntervalSum(M-1,M-1)*p;p=p*M%B print(a%B)