#include<stdio.h>
int D,S,n;
int d,s,w,x,y;
struct T{
int v;
int ly;
};
struct T t[3501][3501];
struct T lx[3501][3501];
int max(int a,int b)
{
return a>b?a:b;
}
void upy(struct T tt[3501][3501],int ox,int oy,int l,int r,int yl,int yr,int k)
{
tt[ox][oy].v=max(tt[ox][oy].v,k);
if(yl<=l&&r<=yr){
tt[ox][oy].ly=max(tt[ox][oy].ly,k);
return;
}
else{
int mid=l+r>>1;
if(yl<=mid)upy(tt,ox,oy<<1,l,mid,yl,yr,k);
if(mid<yr)upy(tt,ox,oy<<1|1,mid+1,r,yl,yr,k);
}
}
void upx(int ox,int l,int r,int xl,int xr,int yl,int yr,int k)
{
upy(t,ox,1,1,S,yl,yr,k);
if(xl<=l&&r<=xr){
upy(lx,ox,1,1,S,yl,yr,k);
return ;
}
else{
int mid=l+r>>1;
if(xl<=mid)upx(ox<<1,l,mid,xl,xr,yl,yr,k);
if(mid<xr)upx(ox<<1|1,mid+1,r,xl,xr,yl,yr,k);
}
}
int quey(struct T tt[3501][3501],int ox,int oy,int l,int r,int yl,int yr)
{
if(yl<=l&&r<=yr)return tt[ox][oy].v;
else{
int ans=tt[ox][oy].ly,mid=l+r>>1;
if(yl<=mid)ans=max(ans,quey(tt,ox,oy<<1,l,mid,yl,yr));
if(mid<yr)ans=max(ans,quey(tt,ox,oy<<1|1,mid+1,r,yl,yr));
return ans;
}
}
int quex(int ox,int l,int r,int xl,int xr,int yl,int yr)
{
if(xl<=l&&r<=xr)return quey(t,ox,1,1,S,yl,yr);
else{
int ans=quey(lx,ox,1,1,S,yl,yr),mid=l+r>>1;
if(xl<=mid)ans=max(ans,quex(ox<<1,l,mid,xl,xr,yl,yr));
if(mid<xr)ans=max(ans,quex(ox<<1|1,mid+1,r,xl,xr,yl,yr));
return ans;
}
}
int main()
{
scanf("%d%d%d",&D,&S,&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d%d%d",&d,&s,&w,&x,&y);
int u=quex(1,1,D,x,x+d-1,y,y+s-1)+w;
upx(1,1,D,x,x+d-1,y,y+s-1,u);
}
printf("%d",quex(1,1,D,1,D,1,S));
}