/*
题意:
给你一些牌子(铜,银,金)分别用1,2,3表示,一开始这些都是铜牌。
现在对这些区间区间进行操作,比如说将1到5的牌子涂成银牌等等。
最后统计这些牌子的总价值。
线段树+lazy标记
*/
#include<string.h> //hdu 1698
#include<stdio.h>
const int maxn=100000+10;
struct node
{
int left,right;
int sum;
int flag;
}Tree[3*maxn];
void build(int left,int right,int pos)
{
Tree[pos].left=left;
Tree[pos].right=right;
Tree[pos].flag=1;
if(left==right)
{
Tree[pos].sum=1;
return ;
}
int mid=(left+right)>>1;
build(left,mid,2*pos);
build(mid+1,right,2*pos+1);
Tree[pos].sum=Tree[2*pos].sum + Tree[2*pos+1].sum ;
}
void update(int left,int right,int pos,int num)
{
/*
if(Tree[pos].left==Tree[pos].right)
{
Tree[pos].sum=num;
return ;
}
*/
if(Tree[pos].flag==num)
return ;
if(Tree[pos].left==left && Tree[pos].right==right)
{
Tree[pos].sum=num*(right-left+1);
Tree[pos].flag=num;
return ;
}
if(Tree[pos].flag)
{
Tree[pos*2].sum= (Tree[pos*2].right- Tree[pos*2].left+1) *Tree[pos].flag;
Tree[pos*2+1].sum= (Tree[pos*2+1].right- Tree[pos*2+1].left+1) *Tree[pos].flag;
Tree[pos*2].flag = Tree[pos*2+1].flag = Tree[pos].flag;
Tree[pos].flag=0;
}
int mid=(Tree[pos].left + Tree[pos].right)>>1;
if(right<=mid)
update(left,right,pos*2,num);
else if(left>mid)
update(left,right,pos*2+1,num);
else
{
update(left,mid,pos*2,num);
update(mid+1,right,pos*2+1,num);
}
Tree[pos].sum=Tree[2*pos].sum + Tree[2*pos+1].sum ;
}
/*
int query(int left,int right,int pos)
{
if(left==Tree[pos].left && right==Tree[pos].right)
{
return Tree[pos].sum;
}
int mid=(Tree[pos].left + Tree[pos].right)>>1;
if(right<=mid)
query(left,right,pos*2);
else if(left>mid)
query(left,right,pos*2+1);
else
{
query(left,mid,2*pos);
query(mid+1,right,2*pos+1);
}
}
*/
int main()
{
int t,n,m,x,y,z;
int Case=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
update(x,y,1,z);
}
printf("Case %d: The total value of the hook is %d.\n",Case++,Tree[1].sum);
}
return 0;
}