树状数组和线段树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;
}
相关推荐
好大哥呀1 分钟前
C++ IDE
开发语言·c++·ide
WW_千谷山4_sch13 分钟前
MYOJ_10599:CSP初赛题单10:计算机网络
c++·计算机网络·算法
BHXDML14 分钟前
JVM 深度理解 —— 程序的底层运行逻辑
java·开发语言·jvm
Wang's Blog17 分钟前
Nodejs-HardCore: 深入解析DBF文件之二进制文件处理指南
开发语言·nodejs
hoiii18718 分钟前
基于LSB匹配的隐写术MATLAB实现程序
开发语言·matlab
J2虾虾25 分钟前
Java使用的可以使用的脚本执行引擎
java·开发语言·脚本执行
幻云201028 分钟前
Next.js指南:从入门到精通
开发语言·javascript·人工智能·python·架构
老马识途2.030 分钟前
java处理接口返回的json数据步骤 包括重试处理,异常抛出,日志打印,注意事项
java·开发语言
CCPC不拿奖不改名36 分钟前
网络与API:从HTTP协议视角理解网络分层原理+面试习题
开发语言·网络·python·网络协议·学习·http·面试
代码游侠1 小时前
学习笔记——HC-SR04 超声波测距传感器
开发语言·笔记·嵌入式硬件·学习