/*
推荐题型:四星
题意:从A到B,接受那些订单可使船的受益最大。要求订单要么完全接受,要么完全拒绝
思路:子类枚举,回溯
回溯概念:在递归构造过程中,生成和检查过程有机结合起来,从而减少不必要的枚举。并不仅仅是指将状态恢复到原来的情况。
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
int n1,n2,n3;
struct Node
{
int a;
int b;
int n;
}node[25];
int p[10];
int ans;
int cmp(const void *a,const void *b)
{
Node *pa=(Node *)a;
Node *pb=(Node *)b;
return pa->n-pb->n;
}
void dfs(int cur)
{
if(cur==n3)
{
int temp=0;
for(int i=0;i<10;i++)
temp+=p[i];
if(temp>ans)
ans=temp;
return;
}
bool ok=true;
int pp[10];
memcpy(pp,p,sizeof(p));
for(int i=node[cur].a;i<node[cur].b;i++)
{
pp[i]+=node[cur].n;
if(pp[i]>n1)
{
ok=false;
break;
}
}
dfs(cur+1);
if(ok)
{
memcpy(p,pp,sizeof(pp));
dfs(cur+1);
}
}
int main()
{
//freopen("data.in","r",stdin);
while(scanf("%d %d %d",&n1,&n2,&n3)==3)
{
if(n1==0 && n2==0 && n3==0) break;
for(int i=0;i<n3;i++)
{
scanf("%d %d %d",&node[i].a,&node[i].b,&node[i].n);
}
qsort(node,n3,sizeof(node[0]),cmp);
memset(p,0,sizeof(p));
ans=0;
dfs(0);
printf("%d\n",ans);
}
return 0;
}
/*
二进制法求子类枚举,结果超时。
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
int n1,n2,n3;
struct Node
{
int a;
int b;
int n;
}node[25];
int ans;
int cmp(const void *a,const void *b)
{
Node *pa=(Node *)a;
Node *pb=(Node *)b;
return pa->n-pb->n;
}
void dfs(int s)
{
bool ok=true;
int p[10];
memset(p,0,sizeof(p));
for(int i=0;i<n3;i++)
if(s & 1<<i)
{
for(int j=node[i].a;j<node[i].b;j++)
{
p[j]+=node[i].n;
if(p[j]>n1)
{
ok=false;
return;
}
}
}
if(ok)
{
int temp=0;
for(int i=0;i<10;i++)
temp+=p[i];
if(temp>ans)
ans=temp;
return;
}
}
int main()
{
//freopen("data.in","r",stdin);
while(scanf("%d %d %d",&n1,&n2,&n3)==3)
{
if(n1==0 && n2==0 && n3==0) break;
for(int i=0;i<n3;i++)
{
scanf("%d %d %d",&node[i].a,&node[i].b,&node[i].n);
}
qsort(node,n3,sizeof(node[0]),cmp);
ans=0;
for(int i=0;i<(1<<n3);i++)
dfs(i);
printf("%d\n",ans);
}
return 0;
}