1 #include <iostream>
2 using namespace std;
3 const int maxn=10000;
4 int a[maxn];
5 int c[maxn];
6
7 void make_c(int i){
8 int x=i&(-i); //2^xi=i&(-i);求区间范围大小,x=2^xi
9 for(int left=i-x+1;left<=i;left++) //区间范围[i-2^x+1,i]
10 {
11 c[i]=c[i]+a[left]; //c[i]表示该区间范围内的元素之和
12 }
13 }
14
15 void updata(int i,int num,int n){ //将a[i]更改为new,更新c[i]数组
16 while(i<=n)
17 {
18 c[i]=c[i]+num;
19 i=i-i&(-i);
20 }
21 }
22
23 int sum(int i){ //前i个元素求和
24 int s=0;
25 while(i>0)
26 {
27 s+=c[i];
28 i-=i&(-i);
29 }
30 return s;
31 }
32
33 int main(){
34 int n;
35 cin>>n;
36 for(int i=1;i<=n;i++)
37 {
38 cin>>a[i];
39 }
40 for(int i=1;i<=n;i++)
41 {
42 make_c(i);
43 }
44 int ans=sum(4);
45 cout<<ans<<endl;
46 for(int i=1;i<=n;i++)
47 cout<<c[i]<<" ";
48 return 0;
49 }