思路:col数组要来标记当前区间的值,一开始所有的区间都为0,然后我们更新的时候,如果当前的区间的col不为0,则说明该区间是纯的,此时,我们应该把这个区间的col往左右子树传,同时计算sum的值,由于是纯的,因此当前节点的左子树和当前节点的右子树的sum可以直接求得,然后在把当前的col改为0,表示当前节点覆盖的区间不纯。(题目懂了就好了)QAQ
/*****************************************
Author :Crazy_AC(JamesQi)
Time :2015
File Name :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
using namespace std;
#define MEM(a,b) memset(a,b,sizeof a)
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
inline int Readint(){
char c = getchar();
while(!isdigit(c)) c = getchar();
int x = 0;
while(isdigit(c)){
x = x * 10 + c - '0';
c = getchar();
}
return x;
}
const int maxn = 1e5 + 10;
int sum[maxn << 2],col[maxn << 2];
void PushDown(int rt,int len){
if (col[rt]){
col[rt << 1] = col[rt << 1 | 1] = col[rt];
sum[rt << 1] = (len - (len >> 1)) * col[rt];
sum[rt << 1 | 1] = (len >> 1) * col[rt];
col[rt] = 0;
}
}
void PushUp(int rt){
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void Build(int L,int R,int rt){
col[rt] = 0;
sum[rt] = 1;
// cout << "L = " << L << '\n';
// cout << "R = " << R << '\n';
if (L == R) return ;
int mid = (L + R) >> 1;
Build(L,mid,rt << 1);
Build(mid + 1,R,rt << 1 | 1);
PushUp(rt);
return ;
}
void Updata(int L,int R,int rt,int l,int r,int color){
if (l <= L && R <= r){
col[rt] = color;
sum[rt] = (R - L + 1) * color;
return;
}
PushDown(rt,R - L + 1);
int mid = (L + R) >> 1;
if (l <= mid) Updata(L,mid,rt << 1,l,r,color);
if (r > mid) Updata(mid + 1,R,rt << 1 | 1,l,r,color);
PushUp(rt);
}
int n,m;
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int iCase = 0;
int T;
T = Readint();
// scanf("%d",&T);
// cout << "ooo = " << T << endl;
while(T--){
// scanf("%d%d",&n,&m);
n = Readint();
m = Readint();
// cout << "n = " << n << '\n';
Build(1,n,1);
for (int i = 0;i < m;++i){
int a,b,c;
a = Readint();
b = Readint();
c = Readint();
Updata(1,n,1,a,b,c);
}
printf("Case %d: The total value of the hook is %d.\n",++iCase,sum[1]);
}
return 0;
}