树状数组(前缀和)

一维:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

long long n,con;
long long a[500005];
long long e[500005]={0};

long long lowbit(long long num){
    return (-num)&num;
}

void change(int pos,long long val){
    int now=pos;
    for(;now<=n;now+=lowbit(now)){
        e[now]+=val;
    }
}
long long getans(int pos){
    if(pos==0){
        return 0;
    }
    long long sum=0;
    int now=pos;
    for(;now>=1;now-=lowbit(now)){
        sum+=e[now];
    }
    return sum;
}

int main(){
    cin>>n>>con;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        change(i,a[i]);
    }
    for(int i=1;i<=con;i++){
        long long type,x,y;
        scanf("%lld%lld%lld",&type,&x,&y);
        if(type==1){//更改
            change(x,y);
        }else if(type==2){//询问
            if(x>y){
                swap(x,y);
            }
            printf("%lld\n",getans(y)-getans(x-1));//获取区间总和
        }
    }
    return 0;
}

可以参考以下内容,讲的不错。

(lowbit证明)http://www.mamicode.com/info-detail-1270028.html
https://pks-loving.blog.luogu.org/senior-data-structure-gao-ji-shuo-ju-jie-gou-chu-bu-yang-xie-fen-kuai

猜你喜欢

转载自www.cnblogs.com/sun123zxy/p/bit.html