P3368 【模板】树状数组 2

还是板子。区间更新,树状数组结合差分。

#include<bits/stdc++.h>
using namespace std;
const int maxn=5*1e5+5;
vector<int>a(maxn);
vector<int>b(maxn);
vector<int>v(maxn);
int n,m,x,y,k,op;
int lowbit(int x){
    return x&(-x);
}
int add(int x,int y){
    while(x<=n){
        v[x]+=y;
        x+=lowbit(x);
    }
}
int sum(int x){
    int sum=0;
    while(x!=0){
        sum+=v[x];
        x-=lowbit(x);
    }
    return sum;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(i==1){
            add(i,a[i]);
        }
        else{
            add(i,a[i]-a[i-1]);
        }
    }
    for(int i=1;i<=m;i++){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d%d",&x,&y,&k);///[x,y]每个数加k
            add(x,k);///差分数组,只需要改x和y+1这两个数,用树状数组维护
            add(y+1,-k);
        }
        else{
            scanf("%d",&x);
            cout<<sum(x)<<endl;
        }
    }
    return 0;
}

 

posted @ 2020-05-21 20:15  mohari  阅读(139)  评论(0编辑  收藏  举报