#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; }