标签:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<map> 5 #define ls l,mid,rt<<1 6 #define rs mid+1,r,rt<<1 |1 7 using namespace std; 8 const int mxn=100020; 9 int data[mxn*4]; 10 int tre[mxn],mini[mxn]; 11 int add[mxn];//懒标记 12 void pushup(int rt){ 13 mini[rt]=min(mini[rt<<1],mini[rt<<1 |1]); 14 } 15 void pushdown(int rt){//向下传递lazy标记 16 if(add[rt]!=0){ 17 add[rt<<1]+=add[rt]; 18 add[rt<<1 |1]+=add[rt]; 19 mini[rt<<1]+=add[rt]; 20 mini[rt<<1 |1]+=add[rt]; 21 add[rt]=0;//标记传递完毕,清除 22 } 23 return; 24 } 25 void Build(int l,int r,int rt){//建树 26 if(l==r){ 27 mini[rt]=data[l]; 28 return; 29 } 30 int mid=(l+r)>>1; 31 Build(ls);Build(rs); 32 pushup(rt); 33 return; 34 } 35 void update_point(int p,int x,int l,int r,int rt){//单点更新 36 if(l==r){ 37 mini[rt]=x; 38 return; 39 } 40 int mid=(l+r)>>1; 41 if(p<=mid)update_point(p,x,ls); 42 else update_point(p,x,rs); 43 return; 44 } 45 void update_area(int L,int R,int c,int l,int r,int rt){//区域更新 46 if(L<=l && r<=R){ 47 add[rt]+=c; 48 mini[rt]+=c; 49 } 50 pushdown(rt); 51 int mid=(l+r)>>1; 52 if(L<=mid)update_area(L,R,c,ls); 53 if(R>mid)update_area(L,R,c,rs); 54 pushup(rt); 55 return; 56 } 57 int query(int L,int R,int l,int r,int rt){//区域查询 58 if(L<=l && r<=R)return mini[rt]; 59 int mid=(l+r)>>1; 60 int ans=1000000; 61 if(L<=mid)ans=min(ans,query(L,R,ls)); 62 if(mid<R)ans=min(ans,query(L,R,rs)); 63 return ans; 64 } 65 int main(){ 66 67 68 69 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5648327.html