lowbit就是2^k.
而c[i]就是i-2^k+1 ~ i
#include<iostream>
using namespace std;
const int maxn = 2000;
int a[maxn];
int c[maxn];
int getsumval(int x)
{
int sum = 0;
/*while(x>0)
{
sum += c[x];
x -= x&(-x);
} */
for(int i=x; i>0; i-= x&(-x))
{
sum += c[i];
}
return sum;
}
void add(int x, int v)
{
/*a[x] += v;
while(x < maxn)
{
c[x] += v;
x += x&(-x);
}*/
a[x] += v;
for(int i=x; i<maxn; i+=x&(-x))
{
c[i] += v;
}
}
int change(int x, int v)
{
int addval = v - a[x];
/*while(x < maxn)
{
a[x] = v;
c[x] += addval;
x += x&(-x);
} */
for(int i=x; i<maxn; i+=x&(-x))
{
a[i] = v;
c[i] += addval;
}
}
int main()
{
add(12, 12);
change(11, 2);
change(8, 8);
cout << getsumval(12) << endl;
add(10, 10);
cout << getsumval(12) << endl;
change(10, 5);
cout << getsumval(12) << endl;
return 0;
}
/*
22
32
27
Process returned 0 (0x0) execution time : 0.253 s
Press any key to continue.
*/