| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 
 | #include <stdio.h>#define MAX_LEN 1000
 
 
 void build_tree(int arr[],int tree[],int node,int start,int end)
 {
 if(start == end)
 {
 tree[node] = arr[start];
 }
 else
 {
 int mid = (start+end)/2;
 int left_node = 2 * node + 1;
 int right_node = 2 * node + 2;
 
 build_tree(arr,tree,left_node,start,mid);
 build_tree(arr,tree,right_node,mid+1,end);
 tree[node] = tree[left_node] + tree[right_node];
 }
 
 }
 
 
 void update_tree(int arr[],int tree[],int node,int start,int end,int idx,int val)
 {
 if(start == end)
 {
 arr[idx] = val;
 tree[node] = val;
 }
 else
 {
 int mid = (start+end)/2;
 int left_node = 2 * node+1;
 int right_node = 2 * node +2;
 if(idx>=start && idx<=mid)
 {
 update_tree(arr,tree,left_node,start,mid,idx,val);
 }
 else
 {
 update_tree(arr,tree,right_node,mid+1,end,idx,val);
 }
 tree[node] = tree[left_node]+tree[right_node];
 }
 }
 
 
 int query_tree(int arr[],int tree[],int node,int start,int end,int L,int R)
 {
 if(R<start  || L>end)
 return 0;
 else if(L<=start && end<=R)
 return tree[node];
 else if(start == end)
 return tree[node];
 else
 {
 int mid = (start+end)/2;
 int left_node = 2*node+1;
 int right_node = 2*node +2;
 int sum_left = query_tree(arr,tree,left_node,start,mid,L,R);
 int sum_right = query_tree(arr,tree,right_node,mid+1,end,L,R);
 }
 
 return sum_left+sum_right;
 }
 int main()
 {
 int arr[] = {1,3,5,7,9,11};
 int size = 6;
 int tree[MAX_LEN] = {0};
 
 build_tree(arr,tree,0,0,size-1);
 for(int i=0;i<15;i++)
 {
 printf("tree[%d] = %d\n",i,tree[i]);
 }
 
 printf("\n");
 update_tree(arr,tree,0,0,size-1,4,6);
 for(int i=0;i<15;i++)
 {
 printf("tree[%d] = %d\n",i,tree[i]);
 }
 
 int ans = query_tree(arr,tree,0,0,size-1,2,5);
 printf("arr[2]~arr[5]的和为%d\n",ans);
 return 0;
 }
 
 
 |