【51nod】【树状数组】小陶的疑惑2
题目
解题思路
差分是通过前缀和来表示当前的数
树状数组可以查询前缀和
问题解决(^ o ^)/
代码
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,w,x,l,r,b[200010],a[200010];
long long tree[200010];
void add(int y)
{
for (;y<=n;y+=y&(-y))
tree[y]+=x;
}
long long sum(int y)
{
long long ans=0;
for (;y;y-=y&(-y))
ans+=tree[y];
return ans;
}
int main()
{
scanf("%lld%lld",&n,&m);
a[1]=0;
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i]-a[i-1]; //求差分数组
x=b[i];
add(i);
}
for (int i=1;i<=m;i++)
{
scanf("%lld",&w);
if (w==1)
{
scanf("%lld%lld%lld",&l,&r,&x);
add(l);
x=-x;
add(r+1); //差分修改
}
else
{
scanf("%lld",&x);
printf("%lld\n",sum(x));
}
}
return 0;
}