有人回答一下吗
by yyjw14 @ 2023-08-26 09:10:25
问题出在初始化,树状数组和读入的数组 $a$ 应该完全不一样吧。帮你改了一下,另外定义了一个 $tr$ 数组,然后把 $a_i-a_{i-1}$ 存到 $tr$ 就可以了
```
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int i,j,k,m,mm,n,x,y,z,mmm,ii;
int a[500005],tr[500005];
int lowbit(int v)
{
return v&(-v);
}
void update(int l,int u)
{
for(m=l;m<=i;)
{
tr[m]+=u;
m+=lowbit(m);
}
return;
}
int search(int yy)
{
mm=0;
for(n=yy;n>0;n-=lowbit(n))
{
mm+=tr[n];
}
return mm;
}
int main()
{
cin>>i>>j;
for(k=1;k<=i;k++)
{
scanf("%d",&a[k]);
update(k,a[k]-a[k-1]);
}
for(k=1;k<=j;k++)
{
cin>>x;
if(x==1)
{
cin>>y>>z>>ii;
update(y,ii);
update(z+1,-ii);
}
else
{
cin>>y;
z=search(y);
cout<<z<<endl;
}
}
return 0;
}
```
by wujingfey @ 2023-10-03 08:32:18
@[csp_sgxx](/user/916380) ~~另外这是树状数组 2,~~ 要求区间修改单点查询。所以应该把差分后的数组存到树状数组,这样求的前缀和才是单点值、修改才是区间修
by wujingfey @ 2023-10-03 08:42:53
@[wujingfey](/user/637073) 这是我一个月前写的现已debug,谢谢
by yyjw14 @ 2023-10-03 16:11:49