Segment tree template - single-point update interval sum +

Topic links:

http://acm.hdu.edu.cn/showproblem.php?pid=1166

Code:

Ordinary segment tree

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 int tree[250000];
 5 int m;
 6 void pushup(int rt)
 7 {
 8     tree[rt]=tree[rt<<1]+tree[rt<<1|1];
 9 }
10 void csh(int l,int r,int rt)
11 {
12     if(l==r)
13     {
14         scanf("%d",&tree[rt]);
15         return ;
16     }
17     else
18     {
19         int m=(l+r)>>1;
20         csh(l,m,rt<<1);
21         csh(m+1,r,rt<<1|1);
22         pushup(rt);
23     }
24 }
25 void update(int k,int c,int l,int r,int rt)
26 {
27     if(l==r)
28     {
29         tree[rt]+=c;
30         return  ;
31     }
32     int m=(l+r)>>1;
33     if(k<=m)
34         update(k,c,l,m,rt<<1);
35     else
36         update(k,c,m+1,r,rt<<1|1);
37     pushup(rt);
38 }
39 int query(int L,int R,int l,int r,int rt)
40 {
41     if(L <= l && r <= R)
42     {
43         return tree[rt];
44     }
45     int m=(l+r)>>1;
46     int ans=0;
47     if(L <= m)
48         ans+=query(L,R,l,m,rt<<1);
49     if(R > m)
50         ans+=query(L,R,m+1,r,rt<<1|1);
51     return ans;
52 }
53 int main()
54 {
55     int jishu;
56     cin>>jishu;
57     for(int kk=1; kk<=jishu; kk++)
58     {
59         int n;
60         scanf("%d",&n);
61         csh(1,n,1);
62         char ch[20];
63         printf("Case %d:\n",kk);
64        while(scanf("%s",ch))
65         {
66            if(ch[0]=='E')
67                break;
68             else
69             {
70                 int a,b;
71                 scanf("%d%d",&a,&b);
72                 if(ch[0]=='Q')
73                     cout<<query(a,b,1,n,1)<<endl;
74                 else
75                 {
76                     if(ch[0]=='A')
77                     {
78                         update(a,b,1,n,1);
79                     }
80                     else
81                         update(a,b*-1,1,n,1);
82                 }
83             }
84         }
85     }
86 }

 

zkw segment tree

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 int tree[250000];
 5 int m;
 6 void csh(int n)
 7 {
 8     memset(tree,0,sizeof(tree));
 9     m=1;
10     while(m<=n)   m<<=1;
11     for(int i=m+1;i<=m+n;i++)   scanf("%d",&tree[i]);
12     for(int i=m-1;i>=0;i--)
13         tree[i]=tree[i<<1]+tree[i<<1|1];
14 }
15 void updata(int n,int v)
16 {
17     int kk=m+n;
18     tree[kk]+=v;
19     kk>>=1;
20     while(kk>=1)
21     {
22         tree[kk]+=v;
23         kk>>=1;
24     }
25 }
26 int query(int s,int r)
27 {
28 
29     int ans = 0;
30     for(s = m + s - 1, r = m + r + 1; s ^ r ^ 1; s >>= 1, r >>= 1)
31     {
32         if(~s&1) ans += tree[s^1];
33         if(r&1) ans += tree[r^1];
34     }
35     return ans;
36 
37 }
38 int main()
39 {
40     int jishu;
41     cin>>jishu;
42     for(int kk=1; kk<=jishu; kk++)
43     {
44         int n;
45         scanf("%d",&n);
46         csh(n);
47         char ch[20];
48         printf("Case %d:\n",kk);
49        while(scanf("%s",ch))
50         {
51 
52             if(ch[0]=='E')
53                break;
54             else
55             {
56                 int a,b;
57                 scanf("%d%d",&a,&b);
58                 if(ch[0]=='Q')
59                     cout<<query(a,b)<<endl;
60                 else
61                 {
62                     if(ch[0]=='A')
63                     {
64                         updata(a,b);
65                     }
66                     else
67                         updata(a,b*-1);
68                 }
69             }
70         }
71     }
72 }

 

Guess you like

Origin www.cnblogs.com/blame/p/11343945.html