#pragma GCC optimize("O3")
#include <bits/stdc++.h>

#define int long long

using namespace std;

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x),end(x)
#define sz(x) (int)(x).size()
#define pb push_back
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	int n;
	cin >> n;
	int a,b, sum = 0;
	cin >> a >> b;
	vector<int> d(n-1);
	for(int &x : d){
		cin >> x;
		sum += x;
	}
	if(sum < a+b){
		cout << "NO\n";
		return 0;
	}
	if((sum-(a+b))%2){
		cout << "NO\n";
		return 0;
	}
	int ca = 0, cb = 0;
	vector<pair<int,int>> sol;
	sol.push_back({0,0});
	for(int i = 0; i < n-1; i++){
		int suf = 0;
		for(int j = i+1; j < n-1; j++) suf += d[j];
		int dis = abs(a-ca)+abs(b-cb);
		if(suf < dis+d[i]){
			int w = suf+d[i]-dis;
			if(w%2){
				cout << "NO\n";
				return 0;
			}
			w /= 2;
			int corr = d[i] - w;
			if(corr > dis){
				cout << "NO\n";
				return 0;
			}
			int na = -1, nb = -1;
			if(corr <= abs(a-ca)){
				if(ca <= a) na = ca+corr;
				else na = ca-corr;
				if(cb <= b) nb = cb-w;
				else nb = cb+w;
			}
			else{
				if(ca <= a) na = a+w;
				else na = a-w;
				corr -= abs(a-ca);
				if(cb <= b) nb = cb+corr;
				else nb = cb-corr;
			}
			sol.push_back({na,nb});
			ca = na, cb = nb;
		} else{
			if(ca <= a){
				sol.push_back({ca-d[i],cb});
				ca -= d[i];
			} else{
				sol.push_back({ca+d[i],cb});
				ca += d[i];
			}
		}
	}
	if(ca != a || cb != b){
		cout << "NO\n";
		return 0;
	}
	cout << "YES\n";
	assert(sz(sol) == n);
	for(auto [a,b] : sol) cout << a << " " << b << "\n";
}