Problem:
F: Power of Power

ICPC で良い成績を収めるには修行が欠かせない．うさぎは ICPC で勝ちたいので，今日も修行をすることにした．

今日の修行は，非常に大きな数の計算を行って，計算力をつけて意識を高めようというものである．大きい数が簡単に出てくる演算として，累乗が挙げられる．

N 個の非負整数 A1, A2, ..., AN がある．これらの並べ替え B1, B2, ..., BN であって，B1B2...BN - 1BN が最大になるものを求めたい．うさぎたちにとってはもちろん常識であるが，この計算は右上から順に行う．また，00 = 1 であると約束することにする．

最大条件を満たす B1, B2, ..., BN は複数通りあるかもしれない．そのような場合は，そのうちで辞書順最小の列を選ぶことにしよう．

Input

N
A1
...
AN

1 ≤ N ≤ 100，0 ≤ Ai ≤ 1,000,000,000 を満たす．

Output

出力は N 行からなる．i 行目には Bi を出力せよ．

Sample Input 1

4
7
5
10
6

Sample Output 1

5
6
7
10

Sample Input 2

3
0
0
1000000000

Sample Output 2

1000000000
0
0

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;

// http://judge.u-aizu.ac.jp/onlinejudge/review.jsp


public class Test
{
	public static void Main()
	{
		  string[] str1 = Console.ReadLine().Split(' ');
		  int n = int.Parse(str1[0]); 

		  int[] a = new int[n];
		  for(int i=0; i<n; i++) {
			string[] str2 = Console.ReadLine().Split(' ');
			a[i] = int.Parse(str2[0]); 
		}
		
		  //Console.WriteLine("改行あり N = {0} P = {1} Ai = {2}", n, p, a);
		  Console.Write(calc(n,a));

	}

  public static string calc(int n,int[] a) {
	  int c0 = 0;
	  int c1 = 0;
	  int c2 = 0;
	  int c3 = 0;
	  int ca = 0;
	  
	  List<int> la = new List<int>();
	  
	  for(int i=0; i<n; i++){
	  	if(a[i]==0) c0++;
	  	if(a[i]==1) c1++;
	  	if(a[i]==2) c2++;
	  	if(a[i]==3) c3++;
	  	if(4<=a[i]) {
			ca++;
			la.Add(a[i]);
		}
	  }
	  la.Sort();
	  
	  List<int> ret = new List<int>();
	  int top = 0;
	  if(c0==0 && c1==0){
		top = 1;
	  } else if(c0==0 && 0<c1){
		top = 1;
		ret.AddRange(Enumerable.Repeat<int>(1, c1));
	  } else if(0<c0 && c1==0){
		if(c0%2==0) { 
			top = 1; 
		} else { 
			top = 0; 
		}
		ret.AddRange(Enumerable.Repeat<int>(0, c0));
	  } else {
		top = 1;
		if(c0%2==0) { 
			ret.AddRange(Enumerable.Repeat<int>(1, c1));
			ret.AddRange(Enumerable.Repeat<int>(0, c0));
		} else { 
			ret.AddRange(Enumerable.Repeat<int>(1, c1-1));
			ret.Add(0);
			ret.Add(1);
			ret.AddRange(Enumerable.Repeat<int>(0, c0-1));
		}
	  }
	  
	  if(top==0) {
		if(0<c2) {
			ret.Add(2);
			c2--;
		} else if(0<c3) {
			ret.Add(3);
			c3--;
		} else {
			if(0<la.Count) {
				ret.Add(la[0]);
				la.RemoveAt(0);
			}
		}
	  	top=1;
	  }
	  
	  if(ca==0 && 0<c2 && c3==1) {
	  	ret.Add(2);
	  	ret.Add(3);
		c2--;
		c3--;
	  }
	  
	  
	  
	  la.Reverse();
	  ret.AddRange(la);
	  ret.AddRange(Enumerable.Repeat<int>(3, c3));
	  ret.AddRange(Enumerable.Repeat<int>(2, c2));
	  string sret = "";
	  foreach(int i in ret) sret = i.ToString() + Environment.NewLine + sret;

	  return sret;
  }
  
  
  
  

}