#include "iostream"
using namespace std;
struct Node
{
int left; //区间的起点
int right; //区间的终点
int mid; //用来进行插入操作的
int value; //值
};
Node Tree[300000];
void BuildTree(int level, int left, int right)//level应该是层的意思
{
Tree[level].value = 1;
Tree[level].left = left;
Tree[level].right = right;
Tree[level].mid = (left+right)/2;
//也就是说,这个树一直发展下线,当他的下线为元节点的时候,返回上一层。
//进行继续的调用,当所有的元节点都建好的时候,整个线段树也就建立好啦
if(left==right)
return;
//如果不是元节点,建立子树
else
{
BuildTree(2*level, left, Tree[level].mid);
BuildTree(2*level+1, Tree[level].mid+1, right);
}
}
//插入操作
void Insert(int level, int left, int right, int value)
{
//如果找到这个节点,并且返回
if(left==Tree[level].left && right==Tree[level].right)
{
Tree[level].value = value;
return;
}
//我感觉是开始的时候,我们建立了一个整体的树,因为屠夫开始的时候都是铜筷子,
//所以,所有的单元的值都是1
//Tree[level].value=0;表示两颗子树的值不相同
//作用很明确,首先把自己的值传递给两颗子树,因为自己大难到啦,让后把自己的
//数值清零,表示两颗子树的值不一样,让后再进行改变
if(Tree[level].value != 0)
{
Tree[2*level].value = Tree[level].value;
Tree[2*level+1].value = Tree[level].value;
Tree[level].value = 0;
}
//插入左区间
if(right <= Tree[level].mid)
Insert(2*level, left, right, value);
//插入右区间
else if(left > Tree[level].mid)
Insert(2*level+1, left, right, value);
//这个其实也很容易理解,就是我把左部分插入到左区间,右部分插入到右区间(当然啦这是一种递归的插入)
else
{
Insert(2*level, left, Tree[level].mid, value);
Insert(2*level+1, Tree[level].mid+1, right, value);
}
}
int SumUp(int level, int left, int right)
{
//这个部分是出口,就像阶乘一样,一定先写的是一个阶乘的出口函数。
//这个部分的功能应该是计算这一层的值。
//如果下一层的值是>0表示这个存贮单元到头了,需要计算一下返回。
if(Tree[level].value > 0)
{
return Tree[level].value*(Tree[level].right-Tree[level].left+1);//因为这个存贮单元的值都是相同的,所以只用×一下就可以啦
}
//算右树
if(left > Tree[level].mid)
return SumUp(2*level+1, left, right);
//算左树
else if(right <= Tree[level].mid)
return SumUp(2*level, left, right);
//其他请款下,算左树和右树的和。
else
return SumUp(2*level, left, Tree[level].mid)+SumUp(2*level+1, Tree[level].mid, right);
//累加的功能是在上面的这个return语句实现的,这个就是递归的妙处了。
}
int main()
{
//freopen("in.txt","r",stdin);
int Case, lenofline, numofoper, left, right, value;
while(cin>>Case)
{
for(int i=1; i<=Case; i++)
{
cin>>lenofline>>numofoper;
BuildTree(1, 1, lenofline);
while(numofoper--)
{
cin>>left>>right>>value;
Insert(1, left, right, value);//我的语言是正确的level不是表示要插入的层次,而是表示当前层的层次
}
cout<<"Case "<<i<<": The total value of the hook is "<<SumUp(1, 1, lenofline)<<"."<<endl;
}
}
return 0;
}