线段树的动态开点
long long cnt=1; long long sum[maxn*150],lazy[maxn*150],Lnode[maxn*150],Rnode[maxn*150]; void PushUp(long long rt){sum[rt]=sum[Lnode[rt]]+sum[Rnode[rt]];} void PushDown(long long rt,long long ln,long long rn){ if(lazy[rt]){//1非工作人,2工作日 lazy[Lnode[rt]]+=lazy[rt];sum[Lnode[rt]]+=lazy[rt]*ln; lazy[Rnode[rt]]+=lazy[rt];sum[Rnode[rt]]+=lazy[rt]*rn; lazy[rt]=0; } } void Update(long long L,long long R,long long C,long long l,long long r,long long rt){ if(L<=l&&r<=R) { sum[rt] += C*(r-l+1); lazy[rt] += C; return; } long long m=(l+r)>>1; if(!Lnode[rt])Lnode[rt]=++cnt; if(!Rnode[rt])Rnode[rt]=++cnt; PushDown(rt,m-l+1,r-m); if(L <= m)Update(L,R,C,l,m,Lnode[rt]); if(R > m)Update(L,R,C,m+1,r,Rnode[rt]); PushUp(rt); } long long Query(long long L,long long R,long long l,long long r,long long rt){ if(L<=l&&r<=R){ return sum[rt]; } long long m=(l+r)>>1; long long ANS=0; PushDown(rt,m-l+1,r-m); if(L <= m)ANS+=Query(L,R,l,m,Lnode[rt]); if(R > m )ANS+=Query(L,R,m+1,r,Rnode[rt]); return ANS; }