zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    2015第14周四
    2015第14周三
    2015第14周二
    2015第14周一
    2015第13周日
    2015第13周六
    2015第13周五
    2015第13周四
    2015第13周三
    2015第13周二
  • 原文地址:https://www.cnblogs.com/mohari/p/12933365.html
Copyright © 2011-2022 走看看