/* 成段更新,总区间求和,刚开始学线段树,只有参考别人的代码的时候才能写出来 */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define LL(x) ((x) << 1) #define RR(x) ((x) << 1 | 1) // 看来以后要学会写这个啊 using namespace std; const int N = 100005; struct Seg_tree{ int l, r, sum; int mid(){ return (r + l) / 2; } }tree[3 * N]; inline void Build(int l, int r, int node){ tree[node].l = l; tree[node].r = r; tree[node].sum = 1; if(l == r){ //tree[node].sum = 1; return; } int mid = (l + r) / 2; Build(l, mid, LL(node)); Build(mid + 1, r, RR(node)); //tree[node].sum = tree[LL(node)].sum + tree[RR(node)].sum; } inline void Update(int l, int r, int node, int val){ if(l <= tree[node].l && tree[node].r <= r){ tree[node].sum = val; return ; } if(tree[node].sum != -1){ tree[LL(node)].sum = tree[RR(node)].sum = tree[node].sum; tree[node].sum = -1; } int mid = tree[node].mid(); if(l <= mid) Update(l, r, LL(node), val); if(mid < r) Update(l, r, RR(node), val); } inline int Question(int l, int r, int node){ if(tree[node].l == l && tree[node].r == r){ if(tree[node].sum != -1){ return (r - l + 1) * tree[node].sum; } else{ int mid = tree[node].mid(); return Question(l, mid , LL(node)) + Question(mid + 1, r, RR(node)); } } int mid = tree[node].mid(); if(r <= mid){ return Question(l, r, LL(node)); } else if(l > mid){ return Question(l, r, RR(node)); } else{ return Question(l, mid, LL(node)) + Question(mid + 1, r, RR(node)); } } int main(){ int t; scanf("%d", &t); for(int i = 1; i <= t; i++){ int n; scanf("%d", &n); Build(1, n, 1); int m; scanf("%d", &m); while(m--){ int x, y, val; scanf("%d %d %d", &x, &y, &val); //puts("ddd"); Update(x, y, 1, val); } //puts("ff"); printf("Case %d: The total value of the hook is %d./n", i, Question(1, n, 1));// 很白痴,把i写成t } }