void build(int r,int L,int R) { if(L==R) sum[1] = 1; else{ int M = (L+R)/2; build(r*2,L,M); build(r*2+1,M+1,R); sum[r] = sum[r*2] + sum[r*2+1]; } } void push_up(int r,int L,int R) { if(lazy[r]>0) { sum[r] = lazy[r]*(R-L+1); } else { sum[r] = sum[r*2] + sum[r*2+1]; } } void push_down(int r) { if(lazy[r]>0) { lazy[r*2] = lazy[r*2+1] = lazy[r]; lazy[r] = 0; } } void update(int r,int L,int R,int ql,int qr,int val) { if(ql<=L&&R<=qr) { lazy[r] = val; sum[r] = val*(R-L+1); } else { int M=(L+R)/2; if(ql<=M) update(r*2,L,M,ql,qr,val); else push_up(r*2,L,M); if(qr>M) update(r*2+1,M+1,R,ql,qr,val); else push_up(r*2+1,M+1,R); push_up(r,L,M); } } void query(int r,int L,int R,int ql,int qr) { if(lazy[r]>0) total += lazy[r]*(min(R,qr)-max(L,ql)+1); else if(ql<=L&&R<=qr) total += sum[r]; else { int M = (L+R)/2; if(ql<=M) query(r*2,L,M,ql,qr); if(qr>=M) quert(r*2+1,M+1,R,ql,qr); } }
线段树区间更新
猜你喜欢
转载自hellojyj.iteye.com/blog/2101728
今日推荐
周排行