C
[
1
]
=
A
[
1
]
;
C[1]=A[1];
C[1]=A[1];
C
[
2
]
=
A
[
1
]
+
A
[
2
]
;
C[2]=A[1]+A[2];
C[2]=A[1]+A[2];
C
[
3
]
=
A
[
3
]
;
C[3]=A[3];
C[3]=A[3];
C
[
4
]
=
A
[
1
]
+
A
[
2
]
+
A
[
3
]
+
A
[
4
]
;
C[4]=A[1]+A[2]+A[3]+A[4];
C[4]=A[1]+A[2]+A[3]+A[4];
C
[
5
]
=
A
[
5
]
;
C[5]=A[5];
C[5]=A[5];
C
[
6
]
=
A
[
5
]
+
A
[
6
]
;
C[6]=A[5]+A[6];
C[6]=A[5]+A[6];
C
[
7
]
=
A
[
7
]
;
C[7]=A[7];
C[7]=A[7];
C
[
8
]
=
A
[
1
]
+
A
[
2
]
+
A
[
3
]
+
A
[
4
]
+
A
[
5
]
+
A
[
6
]
+
A
[
7
]
+
A
[
8
]
;
C[8]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8];
C[8]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8];
C
[
i
]
C[i]
C[i] 就是
i
i
i 的前
x
x
x 位的
A
[
j
]
A[j]
A[j] 的和,
x
x
x 为
i
i
i 二进制最低位
1
1
1 的
2
2
2 次方,如:
C
[
6
]
C[6]
C[6] ,
6
=
0110
6=0110
6=0110,所以就是前
2
2
2 位,
C
[
6
]
=
A
[
5
]
+
A
[
6
]
C[6]=A[5]+A[6]
C[6]=A[5]+A[6],
C
[
8
]
C[8]
C[8],
8
=
1000
8=1000
8=1000,所以就是前
8
8
8 位
然后知道怎么找 i i i 的最低位 1 1 1,就是 lowbit(x)=(x&-x),原理略
之后看
S
u
m
Sum
Sum 函数,就是不断减掉最低位的
1
1
1,因为
C
[
i
]
C[i]
C[i] 是
i
i
i 前
x
x
x 个
A
[
j
]
A[j]
A[j] 的和,如:
S
u
m
(
6
)
:
0110
−
>
0100
−
>
0000
Sum(6): 0110 -> 0100 -> 0000
Sum(6):0110−>0100−>0000
再就是
A
d
d
Add
Add 函数,就是不断加上最低位的
1
1
1,因为
C
[
j
]
C[j]
C[j] 的和里面有
A
[
i
]
A[i]
A[i] 如:
A
d
d
(
5
)
:
0101
−
>
0110
−
>
1000
Add(5): 0101 -> 0110 -> 1000
Add(5):0101−>0110−>1000
int lowbit(int x)
{
return x&-x;
}
int Sum(int x)
{
int tot=0;
while(x) tot+=c[x],x-=lowbit(x);
return tot;
}
void Add(int x,int y)
{
while(x) c[x]+=y,x+=lowbit(x);
}