mx花几分钟用树状数组写了这一道水题后发现意外溢出(似乎是),自己输出debug时发现不知道为什么树状数组在没有被访问过(就是都是 0 )时进行增加操作会使当前会访问的所有节点重新随机化为负数。
举个例子,就像要将节点1增加时,上一个询问都还全是 0 的 1,2,4,8 位置的数组值都全部变成了 −18245566534254592
附自己代码:
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n,k,a[500001];
int lowbit(int x)
{
return x&(-x);
}
void add(int nw,int x)
{
// cout<<nw<<" "<<x<<endl;
// for(int i=1;i<=n;i++) cout<<a[i]<<" ";
// cout<<endl;
for(int i=nw;i<=n;i+=lowbit(i)) a[i]+=x;
}
void mnu(int nw,int x)
{
for(int i=nw;i<=n;i+=lowbit(i)) a[i]-=x;
}
int cal(int x)
{
int ans=0;
for(int i=x;i;i-=lowbit(i)) ans+=a[i];
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&k);
// for(int i=1;i<=n;i++) cout<<i<<" "<<a[i]<<endl;
for(int i=1;i<=k;i++)
{
char c;
int m,p;
scanf("%c",&c);
// for(int j=1;j<=n;j++) cout<<a[j]<<" ";
// cout<<endl;
if(c=='A')
{
scanf("%lld",&m);
printf("%lld\n",cal(m));
}else if(c=='B')
{
scanf("%lld%lld",&m,&p);
// cout<<m<<" "<<p<<" "<<c<<endl;
add(m,p);
}else
{
scanf("%lld%lld",&m,&p);
mnu(m,p);
}
}
return 0;
}