//#pragma GCC optimize("unrool-loop") //#pragma GCC target("avx2") #include <bits/stdc++.h> //#define int int64_t using namespace std; typedef long long ll; 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 ll INF = 1e18; const int M = 24, M2 = 49 - M; ll values[(1 << M) + 1]; ll values2[(1 << M2) + 1]; int d[51]; vi find_comb(int n, ll X, ll Y) { if (n <= M) { int amt = (1LL << n); ll ans = -1; values[0] = 0; loop(mask, 0, amt) { if (mask) { int i = __builtin_ctz(mask); values[mask] = values[mask ^ (1 << i)] + d[i]; } ll sum = values[mask]; if (sum >= X && sum <= Y) { 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 = (1 << M); values[0] = 0; loop(mask, 1, amt) { // ll sum = 0; // loop(i,0,M) if(mask&(1<<i)) sum+=d[i]; int i = __builtin_ctz(mask); values[mask] = values[mask ^ (1 << i)] + d[i]; // values[mask] = sum; } sort(values, values+amt); values[amt] = INF; int amt2 = (1 << (n - M)); int ans2 = -1, value1=-1; values2[0] = 0; loop(mask, 0, amt2) { // loop(i,0,n-M) if(mask&(1<<i)) sum2+=d[M+i]; if (mask) { int i = __builtin_ctz(mask); values2[mask] = values2[mask ^ (1 << i)] + d[M + i]; } ll sum2 = values2[mask]; // sum2 = d[__builtin_ctz(mask)]; if (sum2 > Y || sum2+values[amt-1]<X) continue; int sum1 = *lower_bound(values, values+amt, X - sum2), s = sum1 + sum2; if (s >= X && s <= Y) { ans2 = mask; value1 = sum1; break; } } if (ans2 == -1) return {-1}; int ans1 = -1; values[0] = 0; loop(mask, 0, amt) { if (mask) { int i = __builtin_ctz(mask); values[mask] = values[mask ^ (1 << i)] + d[i]; } ll sum = values[mask]; // loop(i,0,M) if(mask&(1<<i)) sum+=d[i]; // for(int x=mask, i; x; x ^= (1<<i)) { // i = __builtin_ctz(x); // sum += d[i]; // } if (sum == value1) { ans1 = mask; break; } } vector<int> res; loop(i,0,M) if(ans1&(1LL<<i)) res.pb(i); loop(i,0,n-M) if(ans2&(1LL<<i)) res.pb(M+i); return res; } int32_t main() { ios_base::sync_with_stdio(false); auto t = chrono::high_resolution_clock::now(); int n; cin>>n; n--; int a,b; cin>>a>>b; bool trans = 0; if (b < a) swap(a, b), trans = 1; loop(i,0,n) cin>>d[i]; ll sum = 0; loop(i,0,n) sum+=d[i]; if (sum < a+b) return cout<<"NO"<<endl,0; ll diff = sum - (a+b); if (diff % 2 != 0) return cout<<"NO"<<endl,0; ll X = diff / 2; vi inds = find_comb(n, X, X+b+a); if (inds.size() && inds[0]==-1) return cout<<"NO"<<endl,0; // inds = {0, 1}; sum = 0; for(int i:inds) sum+=d[i]; vector<pair<ll, ll>> ps(n); pair<ll, ll> cur = {0,0}; vi in_inds(n); if (sum > X + b) { for(int i:inds) { in_inds[i] = 1; ll dd =d[i]; if (cur.y < b + X) { // cout <<"HI: "<<dd<<endl; if (cur.y + dd <= b + X) { cur.y += dd; ps[i] = {0, dd};; } else { ps[i].y = (b+X) - cur.y; ps[i].x = dd - abs(ps[i].y); cur.x += ps[i].x; cur.y += ps[i].y; } } else { ps[i].x = dd; cur.x += dd; } } loop(i,0,n) { if (!in_inds[i]) { ll 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; } } } } else { for(int i:inds) { in_inds[i] = 1; ll 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]) { ll 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<pair<ll, ll>> 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; } auto s = chrono::high_resolution_clock::now(); auto rv = chrono::duration_cast<chrono::milliseconds>(s-t).count(); cerr << "Took: "<<rv<<" ms"<<endl; return 0; }