首页 > 其他 > 详细

线段树

时间:2021-04-03 13:27:50      阅读:26      评论:0      收藏:0      [点我收藏+]
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1e5 + 5;
void build(int root, int a[], int sum[], int start, int end)
{
    //printf("当前root是%d,当前start是%d,当前end是%d\n",root,start,end);
    if (start == end)
    {
        sum[root] = a[start];
        //printf("a[%d] = %d a[%d] = %d\n",start,a[start],root,a[root]);
        return;
    }
    int mid = (start + end) / 2;
    int left_node = 2 * root + 1;
    int right_node = 2 * root + 2;
    build(left_node, a, sum, start, mid);
    build(right_node, a, sum, mid + 1, end);
    sum[root] = sum[left_node] + sum[right_node];
    //printf("a[root] = %d\n",a[root]);
}
void show(int sum[], int n)
{
    for (int i = 0; i < n; i++)
        cout << sum[i] << " ";
}
void update(int root, int a[], int sum[], int start, int end, int idx, int val)
{
    if (start == end)
    {
        a[idx] = val;
        sum[root] = val;
        return;
    }
    int mid = (start + end) / 2;
    int left_node = 2 * root + 1;
    int right_node = 2 * root + 2;
    if (idx <= mid && idx >= start)
        update(left_node, a, sum, start, mid, idx, val);
    else
        update(right_node, a, sum, mid + 1, start, idx, val);
    sum[root] = sum[left_node] + sum[right_node];
}
int query(int root, int a[], int sum[], int start, int end, int ran1, int ran2)
{
    if (end<ran1 || start>ran2)return 0;
    if (start == end)return sum[root];
    if (start >= ran1 && end <= ran2)
    {
        return sum[root];
    }
    int mid = (start + end) / 2;
    int left_node = 2 * root + 1;
    int right_node = 2 * root + 2;
    int ans1 = query(left_node, a, sum, start, mid, ran1, ran2);
    int ans2 = query(right_node, a, sum, mid+1,end, ran1, ran2);
    return ans1 + ans2;
}
int main(void)
{
    int a[maxn];
    int sum[maxn];
    int n, m; cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    build(0, a, sum, 0, n - 1);
    show(sum, n);
    cout << endl;
    while (m--)
    {
        int x; cin >> x;
        if (x == 1)
        {
            int u, o; cin >> u >> o;
            update(0, a, sum, 0, n - 1, u, o);
            //show(sum,n);
            //show(a,n);
        }
        if (x == 2)
        {
            int u, o; cin >> u >> o;
            int s = query(0, a, sum, 0, n - 1, u, o);
            cout << s << endl;
        }
    }

}

 

线段树

原文:https://www.cnblogs.com/loliconsk/p/14613155.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!