【区间更新+单点查询】树状数组

与单点修改、区间查询的树状数组的区别就是,这个树状数组建立的是差分数组,所以要得到单点的值的话,就是前x的差分和

Code

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&-x
const int N=5e5+12;
int a[N],n,m;
void add(int x,int v)
{
  while(x<=n)
  {
    a[x]+=v;
    x+=lowbit(x);
  }
}
int getsum(int x)
{
  int ans=0;
  while(x)
  {
    ans+=a[x];
    x-=lowbit(x);
  }
  return ans;
}
int main(){
  cin>>n>>m;
  int p,x,y,k;
  for(int i=1;i<=n;i++)
  {
    cin>>x;
    add(i,x);
    add(i+1,-x);
  }
  while(m--)
  {
    cin>>p;
    if( p==1 )
    {
      cin>>x>>y>>k;
      add(x,k);
      add(y+1,-k);
    }
    else{
      cin>>x;
      cout<<getsum(x)<<endl;
    }
  }


}