#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define INF 0x3f3f3f3f #define ONF 0xc0c0c0c0 using namespace std; typedef long long ll; struct node{ int st; int ed; int sum; int mark; }tree[4000005]; void Build_tree(int lf,int rg,int k) { tree[k].st=lf;tree[k].ed=rg; tree[k].sum=0; tree[k].mark=0; //*** if(lf==rg) { tree[k].sum=1; return ; } int mid=(lf+rg)/2; Build_tree(lf,mid,k*2); Build_tree(mid+1,rg,k*2+1); tree[k].sum=tree[k*2].sum+tree[k*2+1].sum; } void Point_down(int k) { tree[k*2].mark=tree[k].mark; tree[k*2+1].mark=tree[k].mark; tree[k*2].sum=tree[k].mark*(tree[k*2].ed-tree[k*2].st+1); tree[k*2+1].sum=tree[k].mark*(tree[k*2+1].ed-tree[k*2+1].st+1); //*** tree[k].mark=0; } void Line_change(int lf,int rg,int k,int x) { if(lf<=tree[k].st&&rg>=tree[k].ed) { tree[k].sum=(tree[k].ed-tree[k].st+1)*x; tree[k].mark=x; //*** return ; } if(tree[k].mark) Point_down(k); int mid=(tree[k].st+tree[k].ed)/2; if(lf<=mid) Line_change(lf,rg,k*2,x); if(rg>mid) Line_change(lf,rg,k*2+1,x); tree[k].sum=tree[k*2].sum+tree[k*2+1].sum; } int main() { int T,n,que; scanf("%d",&T); int g=0; while(T--) { scanf("%d %d",&n,&que); Build_tree(1,n,1); for(int i=1;i<=que;i++) { int lf,rg,x; scanf("%d %d %d",&lf,&rg,&x); Line_change(lf,rg,1,x); } printf("Case %d: The total value of the hook is %d.\n",++g,tree[1].sum); } } https://vjudge.net/contest/262078#problem/C