简单区间更新,col为lazy标记
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 111111
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[maxn<<2];
int col[maxn<<2];
int h , w , n;
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;
int m=(l+r)>>1;
if(l==r)
{
return;
}
build(lson);
build(rson);
pushup(rt);
}
void pushdown(int rt,int m)
{
if (col[rt])
{
col[rt<<1] = col[rt<<1|1] = col[rt];
sum[rt<<1] = (m - (m >> 1)) * col[rt];
sum[rt<<1|1] = (m >> 1) * col[rt];
col[rt] = 0;
}
}
void update(int x,int y,int add,int l,int r,int rt)
{
if(x<=l&&y>=r)
{
col[rt]=add;
sum[rt]=add*(r-l+1);
return;
}
int m=(l+r)>>1,tmp=0;
pushdown(rt,r-l+1);
if(x<=m)
update(x,y,add,lson);
if(y>m)
update(x,y,add,rson);
pushup(rt);
}
int main()
{
int T , n , m;
scanf("%d",&T);
for (int cas = 1 ; cas <= T ; cas ++)
{
scanf("%d%d",&n,&m);
build(1 , n , 1);
while (m --)
{
int a , b , c;
scanf("%d%d%d",&a,&b,&c);
update(a , b , c , 1 , n , 1);
}
printf("Case %d: The total value of the hook is %d.\n",cas , sum[1]);
}
return 0;
}