首页 > 代码库 > 线段树

线段树

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 
 6 using namespace std;
 7 const int N=1001;
 8 
 9 int a[N];
10 int sum[N];
11 
12 void rushu(int jd)
13 {
14     sum[jd]=sum[jd<<1]+sum[jd<<1+1];
15 }
16 
17 void built(int l,int r,int jd)
18 {
19     if(l==r)
20     {
21         sum[jd]=a[l];
22         return ; 
23     }
24     int mid=(l+r)>>1;
25     built(1,mid,jd<<1);
26     built(mid+1,r,jd<<2);
27     rushu(jd);
28 }
29 
30 void gai(int l,int r,int jd,int q,int v)
31 {
32     if(l==r)
33     {
34         sum[jd]=v;
35         return ;
36     }
37     int mid=(l+r)>>1;
38     if(q<mid)gai(l,mid,jd<<1,q,v);
39     if(q>mid)gai(mid+1,r,jd<<1+1,q,v);
40     rushu(jd);
41 }
42 
43 int js(int l,int r,int jd,int nl,int nr)
44 {
45     if(nl<l&&nr<r)
46     {
47         return sum[jd];
48     }
49     int mid=(l+r)>>1;
50     int ans=0;
51     if(mid>nl)ans+=js(l,mid,jd*2,nl,nr);
52     if(mid<nr)ans+=js(mid+1,r,jd*2+1,nl,nr);
53     return ans;
54 }
55 
56 void built(int l,int r,int jd)
57 {
58     if(l==r)
59     {
60         sum[jd]=a[l];
61         return ;
62     }
63     int mid=(l+r)>>1;
64     built(l,mid,jd<<1);
65     built(mid+1,r,jd<<1+1);
66     rushu(jd);
67 }
68 
69 
70 
71 int main()
72 {
73     int n,m;//built ,js ,gai ,ts
74     cin>>n>>m;
75     for(int i=1;i<=n;i++)
76     {
77         cin>>a[i];
78     }
79     
80     built(1,n,1);
81     
82     int _,__;
83     cin>>_>>__;
84     
85     gai(1,n,1,_,__);
86     
87     int ___,____;
88     cin>>___>>____;
89     js(1,n,1,___,____);
90     
91     return 0;
92 }

 

线段树