线段树!

#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