区间修改+单点查询
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int M=100005;
struct Seb_tree
{
int l;
int r;
int col;
};
Seb_tree t[M*4+1];
int n, m, nn;
void build(int l, int r, int k)
{
t[k].l=l;
t[k].r=r;
t[k].col=1;
if (l==r) return;
int mid=(l+r)/2;
build(l ,mid, k*2);
build(mid+1, r, k*2+1);
}
long long query(int l, int r, int k)
{
if (t[k].l>=l && t[k].r<=r)
{
if (t[k].col!=-1)
{
return t[k].col*(r-l+1);
}
else
{
int mid=(l+r)/2;
return query(l, mid, k*2)+query(mid+1, r, k*2+1);
}
}
else
{
int mid=(t[k].l+t[k].r)/2;
if (r<=mid) return query(l, r, k*2);
else if (l>mid) return query(l ,r, k*2+1);
else return query(l, mid, k*2)+query(mid+1, r, k*2+1);
}
}
void updata(int l, int r, int add, int k)
{
if (t[k].l>=l && t[k].r<=r)
{
t[k].col=add;
return;
}
if (t[k].col!=-1)
{
t[k*2].col=t[k*2+1].col=t[k].col;
t[k].col=-1;
}
int mid=(t[k].l+t[k].r)/2;
if (r<=mid) updata(l ,r, add, k*2);
else if (l>mid) updata(l, r, add, k*2+1);
else
{
updata(l ,mid, add, k*2);
updata(mid+1, r, add, k*2+1);
}
}
int main()
{
int j=0;
cin>>nn;
while (nn--)
{
long long ans=0;
cin>>n;
build(1,n,1);
cin>>m;
for (int i=1; i<=m; i++)
{
int l, r, add;
cin>>l>>r>>add;
updata(l, r, add, 1);
}
ans=query(1 ,n, 1);
cout<<"Case "<<++j<<":"<<" The total value of the hook is "<<ans<<'.'<<endl;
}
return 0;
}