对区间进行修改,求和, 在修改和查询的过程中注意延迟操作。
#include <iostream>
#include <cstdio>
#define max (100000+5)
using namespace std;
struct node
{
int l, r, d, sum;
}v[4*max];
void pushup(int n)
{
v[n].sum = v[2*n].sum + v[2*n+1].sum;
}
void pushdown(int n)
{
if (v[n].d)
{
v[2*n].d = v[n].d;
v[2*n+1].d = v[n].d;
v[2*n].sum = ( v[2*n].r - v[2*n].l + 1 )*v[n].d;
v[2*n+1].sum = ( v[2*n+1].r - v[2*n+1].l + 1 )*v[n].d;
v[n].d = 0;
}
}
void build(int l, int r, int n)
{
v[n].l = l;
v[n].r = r;
v[n].d = 0;
if (l == r)
{
v[n].sum = 1;
return ;
}
int mid = ( v[n].l + v[n].r ) / 2;
build(l, mid, 2*n);
build(mid+1, r, 2*n+1);
pushup(n);
}
void update(int l, int r, int d, int n)
{
if (l<=v[n].l && v[n].r<=r)
{
v[n].d = d;
v[n].sum = ( v[n].r - v[n].l + 1 )*d;
return ;
}
pushdown(n);
int mid = ( v[n].l + v[n].r ) / 2;
if (r <= mid)
update(l, r, d, 2*n);
else if (l > mid)
update(l, r, d, 2*n+1);
else
{
update(l, mid, d, 2*n);
update(mid+1, r, d, 2*n+1);
}
pushup(n);
}
int query(int l, int r, int n)
{
if (l<=v[n].l && v[n].r<=r)
{
return v[n].sum;
}
pushdown(n);
int mid = ( v[n].l + v[n].r ) / 2;
if (r <= mid)
return query(l, r, 2*n);
else if (l > mid)
return query(l, r, 2*n+1);
else
return query(l, mid, 2*n)+query(mid+1, r, 2*n+1);
}
int main()
{
int Case, N, Q, a, b, c;
scanf("%d", &Case);
for (int k=1; k<=Case; k++)
{
scanf("%d%d", &N, &Q);
build(1, N, 1);
while (Q--)
{
scanf("%d%d%d", &a, &b, &c);
update(a, b, c, 1);
}
printf("Case %d: The total value of the hook is %d.\n", k, query(1, N, 1));
}
return 0;
}