*模板--数据结构

 

非递归线段树(未测试)

 1 const int maxn=1e5+10;
 2 int a[maxn],n;  //原数组,从1开始
 3 struct SegTree{
 4     int N;
 5     int sum[maxn<<2],add[maxn<<2];
 6     
 7     //建树
 8     void build(){
 9         N=1;while(N<n+2) N<<=1;
10         for(int i=1;i<=n;i++) sum[i+N]=a[i]; //原数组下标+N=存储下标 
11         for(int i=N-1;i>0;i--){
12             sum[i]=sum[i<<1]+sum[i<<1|1];
13             add[i]=0;
14         } 
15     }
16     
17     //点修改,A[p]+=x
18     void update(int p,int x){
19         for(int s=N+p;s;s>>=1){
20             sum[s]+=x;
21         }
22     }
23      
24      //点修改下的区间查询,求A[L..R]的和(不考虑懒惰标记add)
25     int query(int L,int R){
26         int ans=0;
27         for(int s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1){
28             if(~s&1) ans+=sum[s^1];
29             if( t&1) ans+=sum[t^1];
30         }
31         return ans;
32     }
33     
34     //区间修改,A[L..R]+=c
35     void update(int L,int R,int c){
36         int s,t,Ln=0,Rn=0,x=1;
37         for(s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1,x<<=1){
38             sum[s]+=c*Ln;
39             sum[t]+=c*Rn;
40             if(~s&1) add[s^1]+=c,sum[s^1]+=c*x,Ln+=x;
41             if( t&1) add[t61]+=c,sum[t^1]+=c*x,Rn+=x;
42         }
43         for(;s;s>>=1,t>>=1){
44             sum[s]+=c*Ln;
45             sum[t]+=c*Rn;
46         }
47     }
48     
49     //区间修改下的区间查询,求A[L..R]的和
50     int query(int L,int R){
51         int s,t,Ln=1,Rn=0,x=1;
52         int ans=0;
53         for(s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1,x<<=1){
54             if(add[s]) ans+=Ln*add[s];
55             if(add[t]) ans+=Rn*add[t];
56             if(~s&1) ans+=sum[s^1],Ln+=x;
57             if( t&1) ans+=sum[t^1],Rn+=x;
58         }
59         //处理上层标记
60         for(;s;s>>=1;t>>=1){
61             ans+=add[s]*Ln;
62             ans+=add[t]*Rn;
63         }
64         return ans;
65     }
66 };
View Code

 

posted @ 2017-08-05 01:03  yijiull  阅读(178)  评论(0编辑  收藏  举报