#include <bits/stdc++.h>
#define int int64_t
using namespace std;
typedef vector<int> vi;
typedef pair<int, int> ii;
#define loop(i,s,e) for(int i=s; i<e; i++)
#define x first
#define y second
#define all(a) a.begin(),a.end()
#define pb push_back

const int M = 24;
int values[1 << M];
vi find_comb(int n, vi& d, int X, int A) {
    if (n <= M) {
        int amt = (1LL << n);
        int ans = -1;
        loop(mask, 0, amt) {
            int sum = 0;
            loop(i,0,n) if(mask&(1LL<<i)) sum+=d[i];
            if (sum >= X && sum <= X+A) {
                ans = mask;
                break;
            }
        }
        if (ans == -1) return {-1};
        vector<int> res;
        loop(i,0,n) if(ans&(1LL<<i)) res.pb(i);
        return res;
    }
    int amt = (1LL << M);
    loop(mask, 0, amt) {
        int sum = 0;
        loop(i,0,n) if(mask&(1LL<<i)) sum+=d[i];
        values[mask] = sum;
    }
    sort(values, values+amt);
    int amt2 = (1LL << (n - M));
    int ans2 = -1, value1=-1;
    loop(mask, 0, amt2) {
        int sum = 0;
        loop(i,0,n) if(mask&(1LL<<i)) sum+=d[M+i];
        int ind = lower_bound(values, values+amt, sum) - values;
        if (ind < amt ){
            int s = sum + values[ind];
            if (s >= X && s <= X+A) {
                ans2 = mask;
                value1 = values[ind];
                break;
            }
        }
    }
    if (ans2 == -1) return {-1};
    int ans1 = -1;
    loop(mask, 0, amt) {
        int sum = 0;
        loop(i,0,n) if(mask&(1LL<<i)) sum+=d[i];
        if (sum == value1) {
            ans1 = mask;
            break;
        }
    }
    vector<int> res;
    loop(i,0,n) if(ans1&(1LL<<i)) res.pb(i);
    loop(i,0,n) if(ans2&(1LL<<i)) res.pb(M+i);
    return res;
}
int32_t main() {
    ios_base::sync_with_stdio(false);
    int n; cin>>n; n--;
    int a,b; cin>>a>>b;
    bool trans = 0;
//    cout <<"HI:"<<endl;
    if (b < a) swap(a, b), trans = 1;
    vector<int> d(n); loop(i,0,n) cin>>d[i];
    int sum = 0;
    loop(i,0,n) sum+=d[i];
    if (sum < a+b) return cout<<"NO"<<endl,0;
    int diff = sum - (a+b);
    if (diff % 2 != 0) return cout<<"NO"<<endl,0;
    int X = diff / 2;
//    cout << "HI: "<<X<<endl;
    vi inds = find_comb(n, d, X, b);
    if (inds.size() && inds[0]==-1) return cout<<"NO"<<endl,0;
//    for(int x:inds) cout<<x<<" "; cout<<endl;
    vector<ii> ps(n);
    ii cur;
    vi in_inds(n);
    for(int i:inds) {
        in_inds[i] = 1;
        int dd =d[i];
        if (cur.x > -X) {
            if (cur.x - dd >= -X) {
                cur.x -= dd;
                ps[i] = {-dd, 0};;
            } else {
                ps[i].x = -(cur.x - (-X));
                ps[i].y = dd - abs(ps[i].x);
                cur.x += ps[i].x;
                cur.y += ps[i].y;
            }
        } else {
            ps[i].y = dd;
            cur.y += dd;
        }
    }
    loop(i,0,n) {
        if (!in_inds[i]) {
            int dd = d[i];
            if (cur.x < a) {
                if (cur.x + dd <= a) {
                    cur.x += dd;
                    ps[i].x = dd;
                } else {
                    ps[i].x = a - cur.x;
                    ps[i].y = dd - ps[i].x;
                    cur.x += ps[i].x;
                    cur.y += ps[i].y;
                }
            } else {
                ps[i].y = dd;
                cur.y += dd;
            }
        }
    }
    vector<ii> ans(n+1); ans[0] = {0,0};;
    loop(i,0,n) {
        ans[i+1].x = ans[i].x + ps[i].x;
        ans[i+1].y = ans[i].y + ps[i].y;
    }
    if (trans) {
        loop(i,0,n+1) swap(ans[i].x, ans[i].y);
    }
    cout << "YES" << endl;
    loop(i,0,n+1) {
        cout << ans[i].x<<" "<<ans[i].y<<endl;
    }
    return 0;
}