树状数组和线段树C++模板

题目:动态求连续区间和

树状数组

cpp 复制代码
#include <cstdio>
#define LL long long

const LL N = 100010;
LL n, m, a[N], tr[N];

LL lowbit(LL x)
{
    return x & -x;
}

void add(LL x, LL y)
{
    for (LL i = x; i <= n; i += lowbit(i))
        tr[i] += y;
}

LL query(LL x)
{
    LL res = 0;
    for (LL i = x; i >= 1; i -= lowbit(i))
        res += tr[i];
    return res;
}

int main()
{
    scanf("%lld%lld", &n, &m);
    for (LL i = 1; i <= n; i ++ )
    {
        scanf("%lld", &a[i]);
        add(i, a[i]);
    }
    
    while (m -- )
    {
        LL k, a, b;
        scanf("%lld%lld%lld", &k, &a, &b);
        if (!k)
            printf("%lld\n", query(b) - query(a - 1));
        else
            add(a, b);
    }
    return 0;
}

线段树

cpp 复制代码
#include <cstdio>
#define LL long long

const LL N = 100010;
LL n, m, a[N];
struct
{
    LL l;
    LL r;
    LL sum;
}
tr[4 * N];

void pushup(LL u)
{
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}

void build(LL u, LL l, LL r)
{
    if (l == r)
        tr[u] = {l, r, a[l]};
    else
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}

void modify(LL u, LL x, LL y)
{
    if (tr[u].l == tr[u].r)
        tr[u].sum += y;
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if (tr[u].l <= x && x <= mid)  modify(u << 1, x, y);
        else modify(u << 1 | 1, x, y);
        pushup(u);
    }
}

LL query(LL u, LL l, LL r)
{
    LL sum = 0;
    if (l <= tr[u].l && tr[u].r <= r)
        sum += tr[u].sum;
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid)  sum += query(u << 1, l, r);
        if (mid + 1 <= r)  sum += query(u << 1 | 1, l, r);
    }
    return sum;
}

int main()
{
    scanf("%lld%lld", &n, &m);
    for (LL i = 1; i <= n; i ++ )
        scanf("%lld", &a[i]);
    
    build(1, 1, n);
    while (m -- )
    {
        LL k, a, b;
        scanf("%lld%lld%lld", &k, &a, &b);
        if (!k)
            printf("%lld\n", query(1, a, b));
        else
            modify(1, a, b);
    }
    return 0;
}
相关推荐
普if加的帕11 分钟前
java Springboot使用扣子Coze实现实时音频对话智能客服
java·开发语言·人工智能·spring boot·实时音视频·智能客服
2301_8076114941 分钟前
77. 组合
c++·算法·leetcode·深度优先·回溯
安冬的码畜日常1 小时前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
朝阳5811 小时前
Rust项目GPG签名配置指南
开发语言·后端·rust
微网兔子1 小时前
伺服器用什么语言开发呢?做什么用什么?
服务器·c++·后端·游戏
朝阳5811 小时前
Rust实现高性能目录扫描工具ll的技术解析
开发语言·后端·rust
程高兴1 小时前
基于Matlab的车牌识别系统
开发语言·matlab
YuforiaCode1 小时前
第十三届蓝桥杯 2022 C/C++组 修剪灌木
c语言·c++·蓝桥杯
YOULANSHENGMENG2 小时前
linux 下python 调用c++的动态库的方法
c++·python
牛马baby2 小时前
Java高频面试之并发编程-07
java·开发语言·面试