1 /*
2
3
4 */
5 #include<iostream>
6 #include<cstring>
7 #include<cstdio>
8 using namespace std;
9 struct P
10 {
11 int l,r,value;
12 int add;
13 }tr[400005];
14 void Pushup(int rt)
15 {
16 tr[rt].value=tr[rt<<1].value+tr[rt<<1|1].value;
17 }
18 void build(int rt,int l,int r)
19 {
20 tr[rt].l=l;
21 tr[rt].r=r;
22 tr[rt].add=0;
23 if(l==r)
24 {
25 tr[rt].value=1;
26 return ;
27 }
28 int mid=(l+r)/2;
29 build(rt<<1,l,mid);
30 build(rt<<1|1,mid+1,r);
31 Pushup(rt);
32 }
33 /*
34 区间修改,整体改成一个数,所以只需要记录这个数就可以了,区间的和可以用这个数乘以区间长度来求;
35 */
36 void Pushdown(int rt)
37 {
38 if(tr[rt].add<=0)
39 return ;
40 tr[rt<<1].value=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1);
41 tr[rt<<1|1].value=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1);
42 tr[rt<<1].add=tr[rt].add;
43 tr[rt<<1|1].add=tr[rt].add;
44 tr[rt].add=0;
45 }
46 void Update(int rt,int l,int r,int begin,int end,int x)
47 {
48 if(begin<=l&&end>=r)
49 {
50 tr[rt].add=x;
51 tr[rt].value=x*(r-l+1);//把区间更新成x
52 return ;
53 }
54 Pushdown(rt);
55 if(begin <=tr[rt<<1].r)
56 {
57 Update(rt<<1,l,tr[rt<<1].r,begin,end,x);
58 }
59 if(end >=tr[rt<<1|1].l)
60 {
61 Update(rt<<1|1,tr[rt<<1|1].l,r,begin,end,x);
62 }
63 Pushup(rt);//区间下面的值发生变化,所以要pushup
64
65 }
66 int main()
67 {
68 int T,k=1;
69 scanf("%d",&T);
70 while(T--)
71 {
72 int n,q;
73 scanf("%d%d",&n,&q);
74 memset(tr,0,sizeof(tr));
75 build(1,1,n);
76 for(int i=0;i<q;i++)
77 {
78 int ll,rr,v;
79 scanf("%d%d%d",&ll,&rr,&v);
80 Update(1,1,n,ll,rr,v);
81 // for(int j=1;j<=25;j++)
82 // printf("%d:%d\n",j,tr[j].value);
83 }
84 int ans=tr[1].value;
85 printf("Case %d: The total value of the hook is %d.\n",k++,ans);
86 }
87 return 0;
88 }