intlowbit(int x)//返回能整除x的最大2的幂次(例如6的lowbit(6)为2){return x&(-x);}int a[100];//原数组int c[100];//树状数组,表示从i往前lowbit(i)个整数的和//下标必须从1开始,c[i]的覆盖长度为lowbit(i)intgetSum(int x)//返回前x个整数之和{int sum =0;for(int i = x; i >0;i -=lowbit(i))//注意是i > 0不是>=
sum += c[i];return sum;}voidupdate(int x,int v)//将第x个整数加上v{for(int i = x;i <100001; i +=lowbit(i))//写成i<=n也可
c[i]+= v;}intmain(){//初始化数组cfor(int i =1; i <= n ; i++){int x;cin>>x;update(i,x);}}