#include<bits/stdc++.h> using namespace std; const int N = 10001; int a[N]; int tree[N*2]; build_tree(int a[],int tree[],int node,int start,int end1) { if(start == end1) { tree[node] = a[start]; } else{ int mid = (start+end1)/2; int left_node = 2*node+1; int right_node = 2*node+2; build_tree(a,tree,left_node,start,mid); build_tree(a,tree,right_node,mid+1,end1); tree[node] = tree[left_node] + tree[right_node]; } } up_data(int a[],int tree[],int node,int start,int end1,int idx,int val) { if(start == end1) { a[idx] = val; tree[node] = val; } else { int mid = (start+end1)/2; int left_node = 2*node+1; int right_node = 2*node+2; if(idx >= start&&idx<=mid) { up_data(a,tree,left_node,start,mid,idx,val); } else { up_data(a,tree,right_node,mid+1,end1,idx,val); } tree[node] = tree[left_node] + tree[right_node]; } } int query_data(int a[],int tree[],int node, int start, int end1 ,int l ,int r) { if(l>end1||r<start) { return 0; } else if(start == end1) { return tree[node]; } else if(start>=l&&end1<=r) { return tree[node]; } else { int mid = (start+end1)/2; int left_node = 2*node+1; int right_node = 2*node+2; int sum_left = query_data(a,tree,left_node,start,mid,l,r); int sum_right = query_data(a,tree,right_node,mid+1,end1,l,r); return sum_left+sum_right; } } int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; build_tree(a,tree,0,0,n-1); for(int i = 0;i<14;i++) { cout<<tree[i]<<endl; } up_data(a,tree,0,0,n-1,4,6); for(int i = 0;i<14;i++) { cout<<tree[i]<<endl; } cout<<query_data(a,tree,0,0,n-1,3,5)<<endl; return 0; }
线段树!
猜你喜欢
转载自www.cnblogs.com/zyz010206/p/12590652.html
今日推荐
周排行