標籤:blog ar div amp log ad har return
Up函數 用來更新父親節點的值void push(int w){ sum[w] = sum[2*w]+sum[2*w+1];//更新節點值}單點更新 先找出第p個數 然後更新他的值void add(int p,int d,int l,int r,int w){ if(l==r) { sum[w]+=d; return ; } int m = (l+r)/2; if(p<=m) add(p,d,l,m,2*w); else add(p,d,m+1,r,2*w+1); push(w);}******************************************區間求和int query(int p1,int p2,int l,int r,int w){ if(p1<=l&&p2>=r)//區間被完全覆蓋 return sum[w]; int m = (l+r)/2; int re = 0; if(p1<=m) re+=query(p1,p2,l,m,2*w); if(p2>m) re+=query(p1,p2,m+1,r,2*w+1); return re;}***************************************88區間更新down 函數void pushdown(int w,int m){ if(lz[w]) { lz[2*w]+=lz[w]; lz[2*w+1] += lz[w]; sum[2*w] += (lz[w]*(m-(m/2))); sum[2*w+1]+=(lz[w]*(m/2)); lz[w] = 0;//將延遲標記去除 }}void update(int a,int b,int da,int l,int r,int w) { if(a<=l&&b>=r) { lz[w] += da;//多次延遲標記 sum[w]+=da*(r-l+1); return ; } pushdown(w,r-l+1);//更新 int m = (l+r)/2; if(a<=m) add(a,b,da,l,m,2*w); if(b>m) add(a,b,da,m+1,r,2*w+1); pushup(w); }