功能
1.单点更新#区间查找#
模板(一维树状数组)
单点更新+区间查询
int lowbit(int x)
{
return x*-x;
}
int update(int x,int y) //更新#修改的函数
{
while(x<=N) //N是元素个数
{ //c[i]是树状数组
c[x]+=y; //y是要更新的值
x+=lowbit(x);
}
}
int getsum(int x) //区间查询函数
{
int ans =0;
while(x>0)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
区间修改+单点查询
void add(int p, int x)//修改
{
while(p<=n) sum[p]+=x, p+=lowbit(p);
}
void range_add(int l, int r, int x) //修改差分数组
{
add(l,x), add(r+1 , -x);
}
int ask(int p) //单点查询
{
int res = 0;
while(p) res += sum[p] , p -= lowbit(p);
return res ;
}
区间修改+区间查询
void add(int p, int x)
{
while(p<=n) sum1[p] += x, sum2[p] += x*p, p +=lowbit(p);
}
void range_add(int l, int r, int x)
{
add(l,x), add(r+1,-x);
}
int ask(int p)
{
int res = 0;
while(p) res +=(p+1)*sum1[p] - sum2[p], p -= lowbit(p);
return res;
}
void range_ask(int l, int r)
{
return ask(r) - ask(l-1);
}