#include <bits/stdc++.h>
using namespace std;
template <class A, class B>
ostream& operator<<(ostream& out, const pair<A, B>& a) {
  return out << "(" << a.first << ", " << a.second << ")";
}
template <class A>
ostream& operator<<(ostream& out, const vector<A>& a) {
  out << "[";
  for (auto it = a.begin(); it != a.end(); ++it) {
    if (it != a.begin()) out << ", ";
    out << *it;
  }
  return out << "]";
}
const int INF = 1e9;
const long long INF64 = 1e18;
const int MOD1 = 1e9 + 7;
const int MOD2 = 1e9 + 9;
const int MOD3 = 1e9 + 21;
const int BASE1 = 300007;
const int BASE2 = 300017;
const long double PI = acosl(-1.0);
const long double EPS = 1e-9;
const int N = 100 * 1000 + 13;
int n;
int c[N];
bool read() {
  if (scanf("%d", &n) != 1) return false;
  for (int i = 0; i < int(n); ++i) scanf("%d", &c[i]);
  return true;
}
int a[N], mx[N];
bool check() {
  cerr << n - int((set<int>(a, a + n)).size()) << endl;
  if (n - int((set<int>(a, a + n)).size()) > (n + 2) / 3) return false;
  for (int i = 0; i < int(n); ++i) a[i] = c[i] - a[i];
  cerr << n - int((set<int>(a, a + n)).size()) << endl;
  return (n - int((set<int>(a, a + n)).size()) <= (n + 2) / 3);
}
void solve() {
  vector<pair<int, int> > tmp;
  for (int i = 0; i < int(n); ++i) tmp.push_back(make_pair(c[i], i));
  sort((tmp).begin(), (tmp).end());
  for (int i = 0; i < int((n + 1) / 3); ++i) a[tmp[i].second] = i;
  for (int i = int((n + 1) / 3); i < int(2 * ((n + 1) / 3)); ++i)
    a[tmp[i].second] = tmp[i].first - i;
  for (int i = int(2 * ((n + 1) / 3)); i < int(n); ++i)
    a[tmp[i].second] = tmp[i].first - (n - 1 - i);
  if (!check()) {
    puts("NO");
    return;
  }
  puts("YES");
  for (int i = 0; i < int(n); ++i) printf("%d ", a[i]);
  puts("");
  for (int i = 0; i < int(n); ++i) printf("%d ", c[i] - a[i]);
  puts("");
}
int main() {
  cout << fixed << setprecision(10);
  cerr << fixed << setprecision(10);
  if (read()) {
    solve();
  }
}
