数据结构:树状数组

快速求单点修改,区间求和;

或者可以求区间修改,单点求值,只需树状数组维护原数组的查分数组即可。

单点修改,区间求和:

#include<bits/stdc++.h>
using namespace std;
int n,m,c[500010]={};
int lowbit(int x){
    return x&-x;
}
void f1(int x,int k){
    
    for(;x<=n;x+=lowbit(x)) c[x]+=k;
} 
int f2(int x){
    int ans=0;
    for(;x;x-=lowbit(x)) ans+=c[x];
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int a;
        cin>>a;
        f1(i,a);
    }
    for(int i=1;i<=m;i++){
        int opt;
        cin>>opt;
        if(opt==1) {
            int a,b;
            cin>>a>>b;
            f1(a,b);
        }
        else {
            int x,y;
            cin>>x>>y;
            cout<<f2(y)-f2(x-1)<<endl;
        }
    }
    return 0;
} 

 

posted @ 2018-10-09 22:09  uncklesam7  阅读(124)  评论(0编辑  收藏  举报