ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++树状数组与线段树模板

2022-02-01 18:32:17  阅读:106  来源: 互联网

标签:aa 树状 int sum cin c++ mid 模板 define


输入输出样例

10 5
1 2 3 4 5 6 7 8 9 10
1 1 5 
0 1 3
0 4 8 
1 7 5
0 4 8

输出效果

11
30
35
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int w[100006];
struct node{
    int l,r;
    int sum;

}aa[400006];

void pushup(int u){
    aa[u].sum = aa[u*2].sum+aa[u*2+1].sum;
}

void build(int u,int l,int r){
    if(l==r) aa[u]={l,r,w[l]};
    else{
        aa[u]={l,r};
        int mid = (l+r)/2;
        build(u*2,l,mid);
        build(u*2+1,mid+1,r);
        pushup(u);
    }
}
int query(int u,int l,int r){
    if(l<=aa[u].l && aa[u].r<=r) return aa[u].sum;
    int mid = (aa[u].l+aa[u].r)/2;
    int sum = 0;
    if(l<=mid) sum+=query(u*2,l,r);
    if(r>mid) sum+= query(u*2+1,l,r);
    return sum;
}
void modify(int u,int x,int v){
    if(aa[u].l == aa[u].r) aa[u].sum += v;
    else{
        int mid =(aa[u].l+aa[u].r)/2;
        if(x<=mid) modify(u*2,x,v);
        else modify(u*2+1,x,v);
        pushup(u);
    }
}

int main()
{
    cin >> n >> m;
    int x,a,b;
    for(int i =11;i<=n;i++) cin >> w[i];
    build(1,1,n);
    while(m--){
        cin >> x >> a >> b;
        if(!x) cout << query(1,a,b) << endl;
        else modify(1,a,b);
    }
    return 0;

}

#include<bits/stdc++.h>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
//#define debug freopen("input.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e6+10;
using namespace std;

int N,M;
int arr[maxn];
int tr[maxn];

int lowbit(int x){
    return x&-x;
}
void add(int idx,int v){
    for(int i =idx;i<=N;i+=lowbit(i)) tr[i]+=v;
}
ll query(int r){
    ll sum = 0;
    for(int i= r;i>=1;i-= lowbit(i)) sum+=tr[i];
    return sum;
}
int main()
{
    //debug
    ios;
    cin >> N >> M;
    for(int i =1;i<=N;i++) cin >> arr[i];
    for(int i =1;i<=N;i++) add(i,arr[i]);
    while(M--){
        int k,a,b;
        cin >> k >> a >> b;
        if(k==0){
            cout << query(b) - query(a-1) << endl;
        }else{
            add(a,b);
        }
    }
    return 0;
}

标签:aa,树状,int,sum,cin,c++,mid,模板,define
来源: https://blog.csdn.net/m0_37149062/article/details/122765315

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有