树状数组
树状数组
单点修改 区间查询
修改 查询复杂度 \(O(log \ n)\)
int lowbit(x)
{
return x&-x;
}
void add(int x,int k)
{
while(x<=n)
{
tree[x]+=k;
x+=lowbit(x);
}
}
int query(int x)
{
int ans=0;
while(x)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
区间修改 单点查询
int lowbit(int x)
{
return x&-x;
}
void add(int x,int y,int k)
{
change(x,k);
change(y+1,-k);
}
void change(int x,int k)
{
while(x<=n)
{
delta[x]+=k;
x+=lowbit(x);
}
}
int query(int x)
{
int sum=0;
while(x)
{
sum+=delta[x];
x-=lowbit(x);
}
return start[x]+sum;
}