本题为树状数组模板题
同 【模板】树状数组 1 一样,只是增加了一些操作
变通一下就好了。
C o d e Code Code
#include<iostream>
#include<cstdio>
using namespace std;
int tree[5000010],a[5000010];
int n,m,w,x,y,k;
int lowbit(int x)
{
return x&-x;
}
void add(int i,int k)
{
while(i<=n)
{
tree[i]+=k;
i+=lowbit(i);
}
}
int sum(int x)
{
int ans=0;
while(x!=0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int i=1; i<=m; i++)
{
scanf("%d",&w);
if(w==1)
{
scanf("%d%d%d",&x,&y,&k);
add(x,k);
add(y+1,-k); //只取[x,y]区间,多余的要减掉
}
else if(w==2)
{
cin>>x;
cout<<a[x]+sum(x)<<endl; //要把自己操作后的也加上
}
}
return 0;
}