import sys def main(): sys.setrecursionlimit(1 << 25) input = sys.stdin.read().split() N = int(input[0]) A = list(map(int, input[1:N+1])) if N == 0: return max_A = max(A) if A else 0 # Frequency array freq = [0] * (max_A + 2) for a in A: freq[a] += 1 # Calculate cnt array cnt = [0] * (max_A + 2) for d in range(1, max_A + 1): multiple = d while multiple <= max_A: cnt[d] += freq[multiple] multiple += d # Collect d candidates in descending order d_candidates = [] for d in range(max_A, 0, -1): if cnt[d] > 0: d_candidates.append(d) # Initialize answer array and Union-Find structure ans = [0] * N uf_parent = list(range(N + 2)) # 0..N inclusive def find(x): if uf_parent[x] != x: uf_parent[x] = find(uf_parent[x]) return uf_parent[x] # Process each d in descending order for d in d_candidates: required = N - cnt[d] k_min = max(0, required) if k_min >= N: continue current = find(k_min) while current < N: ans[current] = d uf_parent[current] = current + 1 current = find(current) # Print the results for a in ans: print(a) if __name__ == '__main__': main()