1. 程式人生 > >線段樹

線段樹

math cin mat using i++ esp str ace name

 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 }

線段樹