#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
template <typename T>
using V = std::vector<T>;
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int main() {
  int N;
  scanf("%d", &N);
  V<int> x(N);
  V<long long> s(N);
  for (int i = 1; i < N; i += 2) {
    scanf("%d", &x[i]);
  }
  long long prev = 1e18;
  for (int i = N - 1; i >= 0; i -= 2) {
    if (x[i] % 4 == 2) {
      puts("No");
      return 0;
    }
    for (int p = 1; p * p < x[i]; p++) {
      if (x[i] % p) continue;
      int q = x[i] / p;
      if ((p + q) % 2 == 0) {
        int a = (p + q) / 2, b = (q - p) / 2;
        if (a < prev) {
          s[i] = a;
          s[i - 1] = b;
          prev = b;
        }
      }
      if (s[i]) break;
    }
    if (!s[i]) {
      puts("No");
      return 0;
    }
  }
  puts("Yes");
  V<long long> ans(N);
  ans[0] = s[0] * s[0];
  for (int i = 2; i < N; i += 2) {
    ans[i] = s[i] * s[i] - s[i - 1] * s[i - 1];
  }
  for (int i = 0; i < (N); i++) {
    if (x[i]) {
      printf("%d ", x[i]);
    } else {
      printf("%lld ", ans[i]);
    }
  }
  puts("");
}
