1.单点修改、区间查询
int lowbit(int x)
{
return x=x&(-x);
}
单点修改
void update(int x,int num)
{
for(int i=x;i<=n;i+=lowbit(i))
C[i]+=num;
}
区间查询
int getsum(int x)
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
ans+=C[i];
return ans;
}
2.区间修改、单点查询
与1一样,只不过存的是差分前缀和
3.区间修改、区间查询
const int N=1e6+5;
int sum1[N],sum2[N];
void add(int pos,int value)
{
for(int i=pos;i<N;i+=lowbit(i))
{
sum1[i]+=value;
sum2[i]+=pos*value;
}
}
int query(int pos)
{
int sum=0;
for(int i=pos;i;i-=lowbit(i))
sum+=(pos+1)*sum1[i]-sum2[i];
return sum;
}