【模板】树状数组

题目传送门1

较好的博客传送门

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#define INF 0x7f7f7f
using namespace std;
int n,tree[1000001]={0},a[1000001]={0}; 
int lowbit(int x){
    return (-x)&x;
}
int add(int ip,int k){
    for(int i=ip;i<=n;i+=lowbit(i)) tree[i]+=k;
    return 0;
}
int sum(int ip){
    int ans=0;
    for(int i=ip;i>0;i-=lowbit(i)) ans+=tree[i];
    return ans;
}
int main(){
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        add(i,a[i]);
    }
    while(m--){
        int tp;
        scanf("%d",&tp);
        if(tp==1){
            int x1,x2;
            scanf("%d%d",&x1,&x2);
            add(x1,x2);
        }
        else{
            int x1,x2;
            scanf("%d%d",&x1,&x2);
            printf("%d\n",sum(x2)-sum(x1-1));
        }
    }
    return 0;
}

 题目传送门2

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#define INF 0x7f7f7f
using namespace std;
int n,tree[1000001]={0},a[1000001]={0}; 
int lowbit(int x){
    return (-x)&x;
}
int add(int ip,int k){
    for(int i=ip;i<=n;i+=lowbit(i)) tree[i]+=k;
    return 0;
}
int sum(int ip){
    int ans=0;
    for(int i=ip;i>0;i-=lowbit(i)) ans+=tree[i];
    return ans;
}
int main(){
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    while(m--){
        int tp;
        scanf("%d",&tp);
        if(tp==1){
            int x1,x2,x3;
            scanf("%d%d%d",&x1,&x2,&x3);
            add(x1,x3);
            add(x2+1,-x3);
        }
        else{
            int x1,x2;
            scanf("%d",&x1);
            printf("%d\n",a[x1]+sum(x1));
        }
    }
    return 0;
}

 

posted @ 2021-08-03 19:26  latent_Lin  阅读(33)  评论(0)    收藏  举报