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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args)throws Throwable {
        MyScanner sc=new MyScanner();
        PrintWriter pw=new PrintWriter(System.out);

        int n=sc.nextInt();
        int m=(1<<n);
        int [] a=new int [m];
        pair [] max1=new pair [m];
        pair [] max2=new pair [m];
        for(int i=0;i<m;i++)
            a[i]=sc.nextInt();
        for(int i=0;i<m;i++){
            pair p=new pair(i,a[i]);
            if(max1[i]==null || max1[i].val<p.val){
                max2[i]=max1[i];
                max1[i]=p;
            }else
            if(max2[i]==null || max2[i].val<p.val)
                max2[i]=p;

            for(int j=0;j<n;j++)
                if((i & (1<<j))==0){
                    int k=i | (1<<j);

                    if(max1[k]==null){
                        max1[k]=max1[i];
                        max2[k]=max2[i];
                    }else{
                        if(max1[k].val<max1[i].val){
                            max2[k]=max1[k];
                            max1[k]=max1[i];
                            if(max2[k].val<max2[i].val){
                                max2[k]=max2[i];
                            }
                        }else
                            if(max2[k].val<max1[i].val)
                                max2[k]=max1[i];
                    }
                }
                if(i>0)
                    pw.println(max1[i].val+max2[i].val);
        }

        pw.flush();
        pw.close();
    }

    static class pair{
        int idx,val;
        pair(int i,int v){
            idx=i;
            val=v;
        }
    }

    static class MyScanner {
        BufferedReader br;
        StringTokenizer st;
        public MyScanner() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }
        String next() {while (st == null || !st.hasMoreElements()) {
            try {st = new StringTokenizer(br.readLine());}
            catch (IOException e) {e.printStackTrace();}}
            return st.nextToken();}
        int nextInt() {return Integer.parseInt(next());}
        long nextLong() {return Long.parseLong(next());}
        double nextDouble() {return Double.parseDouble(next());}
        String nextLine(){String str = "";
            try {str = br.readLine();}
            catch (IOException e) {e.printStackTrace();}
            return str;}
    }
}