Problem:
Score : 700 points

Problem Statement

There is an integer sequence of length 2^N: A_0, A_1, ..., A_{2^N-1}. (Note that the sequence is 0-indexed.)

For every integer K satisfying 1 \leq K \leq 2^N-1, solve the following problem:

Let i and j be integers. Find the maximum value of A_i + A_j where 0 \leq i < j \leq 2^N-1 and (i or j) \leq K.
Here, or denotes the bitwise OR.

Constraints

1 \leq N \leq 18

1 \leq A_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_0 A_1 ... A_{2^N-1}

Output

Print 2^N-1 lines.
In the i-th line, print the answer of the problem above for K=i.

Sample Input 1

2
1 2 3 1

Sample Output 1

3
4
5

For K=1, the only possible pair of i and j is (i,j)=(0,1), so the answer is A_0+A_1=1+2=3.

For K=2, the possible pairs of i and j are (i,j)=(0,1),(0,2).
When (i,j)=(0,2), A_i+A_j=1+3=4. This is the maximum value, so the answer is 4.

For K=3, the possible pairs of i and j are (i,j)=(0,1),(0,2),(0,3),(1,2),(1,3),(2,3) .
When (i,j)=(1,2), A_i+A_j=2+3=5. This is the maximum value, so the answer is 5.

Sample Input 2

3
10 71 84 33 6 47 23 25

Sample Output 2

81
94
155
155
155
155
155

Sample Input 3

4
75 26 45 72 81 47 97 97 2 2 25 82 84 17 56 32

Sample Output 3

101
120
147
156
156
178
194
194
194
194
194
194
194
194
194

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef long long int int64;

#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define ABS(a) ((a)>(0)?(a):-(a))

typedef struct top2{
  int a,b;
} val;

void max(val *x,val *a,val *b,int *array){
  int i,j,k,l;
  i=a->a;
  j=a->b;
  k=b->a;
  l=b->b;
  x->a=array[i]>=array[k]?i:k;
  if(i==k){
    x->b=array[j]>=array[l]?j:l;
    return;
  }
  if(array[i]<array[k]){
    k=i;
  }
  k=array[k]>=array[l]?k:l;
  x->b=array[j]>=array[k]?j:k;
  return;
}

void run(void){
  int n;
  scanf("%d",&n);
  int len=1<<n;
  int *a=(int *)malloc(sizeof(int)*len);
  int i;
  for(i=0;i<len;i++) scanf("%d",a+i);
  val *array=(val *)malloc(sizeof(val)*len);
  for(i=0;i<len;i++){
    array[i].a=a[0]>=a[i]?0:i;
    array[i].b=array[i].a^i;
  }
  for(i=1;i<len;i++){
    int j;
    for(j=0;(1<<j)<len;j++){
      if(((i>>j)&0x01)==1 && (i^(1<<j))!=0){
	max(array+i,array+i,array+(i^(1<<j)),a);
      }
    }
  }
  int max=0;
  for(i=1;i<len;i++){
    max=MAX(max,a[array[i].a]+a[array[i].b]);
    printf("%d\n",max);
  }
  return;
}

int main(void){
  run();
  return 0;
}