线段树求整个区间的和//#pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <stack>#include <queue>#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <vector>#include <cstring>#include <algorithm>#define INF 0x3fffffff#define N 100010#define M (N << 2)#define LL long long#define mod 95041567using namespace std;struct Node{ int set; int sum; int l, r;};Node p[M];void build(int rt, int l, int r){ p[rt].l = l; p[rt].r = r; p[rt].set = 0; if(l == r){ p[rt].sum = 1; return ; } int mid = (r - l) / 2 + l; int lc = rt << 1; int rc = lc + 1; build(lc, l, mid); build(rc, mid + 1, r); p[rt].sum = p[lc].sum + p[rc].sum;}void pushdown(int rt){ if(! p[rt].set) return ; int lc = rt << 1; int rc = lc + 1; p[lc].set = p[rc].set = p[rt].set; p[lc].sum = p[lc].set * (p[lc].r - p[lc].l + 1); p[rc].sum = p[rc].set * (p[rc].r - p[rc].l + 1); p[rt].set = 0;}void update(int rt, int l, int r, int L, int R, int val){ if(l == L && r == R) { p[rt].set = val; p[rt].sum = (R - L + 1) * val; return ; } pushdown(rt); int mid = (r - l) / 2 + l; int lc = rt << 1; int rc = lc + 1; if(R <= mid) update(lc, l, mid, L, R, val); else if(L > mid) update(rc, mid + 1, r, L, R, val); else { update(lc, l, mid, L, mid, val); update(rc, mid + 1, r, mid + 1, R, val); } p[rt].sum = p[lc].sum + p[rc].sum;}int main() { // freopen("in.txt", "r", stdin); int n, m, t, cnt = 0; scanf("%d", &t); while(t --){ scanf("%d %d", &n, &m); build(1, 1, n); while(m --){ int i, j, val; scanf("%d %d %d", &i, &j, &val); update(1, 1, n, i, j, val); } printf("Case %d: The total value of the hook is %d.\n", ++ cnt, p[1].sum); } return 0;}