#include <bits/stdc++.h>
using namespace std;
const long long int M = 2e5 + 10;
const long long int mod = 1e9 + 7;
const long long int infi = LLONG_MAX;
long long int ans, k, n, x, y, m, mymax = LLONG_MIN, mymin = LLONG_MAX, b[M], c,
                                  z, sum;
vector<long long int> v[M];
long long int a[M];
bool check(long long int index) {
  return (b[index] >= index && b[index] > b[index - 1]);
}
int main() {
  long long int i, j;
  scanf("%lld", &n);
  i = 2;
  bool is_possible = true;
  b[3] = 1e9;
  while (i <= n) {
    scanf("%lld", &a[i]);
    if ((a[i] % 4) == 2) {
      is_possible = false;
    }
    i += 2;
  }
  if (!is_possible) {
    printf("No\n");
    return 0;
  }
  i = n;
  long long int last_val = 1e15;
  while (i >= 2) {
    long long int curr_b = 1;
    bool val_found = false;
    while (curr_b * curr_b <= a[i]) {
      if ((a[i] % curr_b) == 0) {
        long long int curr_a = a[i] / curr_b;
        if (curr_a + curr_b < last_val && ((curr_b + curr_a) % 2 == 0)) {
          b[i] = (curr_a + curr_b) / 2;
          b[i - 1] = (curr_a - curr_b) / 2;
          last_val = curr_a - curr_b;
          val_found = true;
          break;
        }
      }
      curr_b++;
    }
    if (!val_found) {
      printf("No\n");
      return 0;
    }
    if (!(check(i) && check(i - 1))) {
      printf("No\n");
      return 0;
    }
    i -= 2;
  }
  a[1] = b[1] * b[1];
  printf("Yes\n");
  i = 3;
  while (i <= n) {
    a[i] = b[i] * b[i] - b[i - 1] * b[i - 1];
    i += 2;
  }
  for (i = 1; i < n + 1; i++) printf("%lld ", a[i]);
  printf("%s", "\n");
  return 0;
}
