树状数组和线段树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;
}
相关推荐
林开落L17 分钟前
库制作与原理(下)
linux·开发语言·centos·库制作与原理
fengfuyao9851 小时前
基于MATLAB的GUI实现人脸检测、眼睛检测以及LBP直方图显示
开发语言·计算机视觉·matlab
蒋星熠1 小时前
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
网络·c++·人工智能·深度学习·性能优化·系统架构
CHANG_THE_WORLD1 小时前
# C++ 中的 `string_view` 和 `span`:现代安全视图指南
开发语言·c++
雨落倾城夏未凉1 小时前
9.c++new申请二维数组
c++·后端
Franklin1 小时前
Python界面设计【QT-creator基础编程 - 01】如何让不同分辨率图像自动匹配graphicsView的窗口大小
开发语言·python·qt
雨落倾城夏未凉2 小时前
8.被free回收的内存是立即返还给操作系统吗?为什么?
c++·后端
雨落倾城夏未凉2 小时前
6.new和malloc的区别
c++·后端
郝学胜-神的一滴2 小时前
深入理解QFlags:Qt中的位标志管理工具
开发语言·c++·qt·程序人生
柯南二号2 小时前
【Java后端】MyBatis-Plus 原理解析
java·开发语言·mybatis