#include <bits/stdc++.h> using namespace std; long long inf = 1e18; struct drept { long long x_min, x_max; long long y_min, y_max; drept() {} drept(long long a, long long b, long long c, long long d) { if(a > b) swap(a, b); if(c > d) swap(c, d); x_min = a; x_max = b; y_min = c; y_max = d; } }; long long n, old_a, old_b, a, b; long long d[55]; long long r_mare[55], r_mic[55]; long long max_d[55], sum[55]; pair<long long, long long> ans[55]; pair<long long, long long> inter_drept(drept a, drept b) { long long x_min = max(a.x_min, b.x_min); long long x_max = min(a.x_max, b.x_max); long long y_min = max(a.y_min, b.y_min); long long y_max = min(a.y_max, b.y_max); for(long long x=x_min;x<=x_min+10;x++){ for(long long y=y_min;y<=y_min+10;y++){ if(x<=x_max && y<=y_max && (x+y)%2==0) return {x,y}; } } return {inf,inf}; } pair<long long, long long> find_point(pair<long long, long long> last, long long d, long long rad_mare, long long rad_mic) { drept eu[5]; eu[0] = drept(last.first - d, last.first + d, last.second + d, last.second + d); eu[1] = drept(last.first - d, last.first + d, last.second - d, last.second - d); eu[2] = drept(last.first - d, last.first - d, last.second + d, last.second -d); eu[3] = drept(last.first + d, last.first + d, last.second + d, last.second - d); drept el[5]; el[0] = drept(a-rad_mare, a-rad_mic, b-rad_mare, b+rad_mare); el[1] = drept(a+rad_mic, a+rad_mare, b-rad_mare, b+rad_mare); el[2] = drept(a-rad_mare, a+rad_mare, b-rad_mare, b-rad_mic); el[3] = drept(a-rad_mare, a+rad_mare, b+rad_mic, b+rad_mare); for(long long i=0; i<4; i++) for(long long j=0; j<4; j++) { pair<long long, long long> inter = inter_drept(eu[i], el[j]); if(inter != make_pair(inf, inf)) return inter; } cout<<"NO\n"; exit(0); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; cin>>old_a>>old_b; a = old_a - old_b; b = old_a + old_b; long long s=0; for(long long i=1;i<n;i++){ cin>>d[i]; s+=d[i]; } if(s%2!=max(abs(a),abs(b))%2){ cout<<"NO\n"; return 0; } for(int i=n-1; i>=1; i--) { max_d[i] = max(max_d[i+1], d[i]); sum[i] = sum[i+1] + d[i]; } r_mare[n] = 0; r_mic[n] = 0; for(long long i=n-1; i>=1; i--) { r_mare[i] = r_mare[i+1] + d[i]; r_mic[i] = max(max_d[i] - (sum[i] - max_d[i]), 0ll); } long long dist = max(abs(a), abs(b)); if(dist > r_mare[1] || dist < r_mic[1]) { cout<<"NO\n"; return 0; } ans[1] = {0, 0}; for(long long i=2;i<=n;i++) ans[i] = find_point(ans[i-1], d[i-1], r_mic[i], r_mare[i]); ans[n] = {a, b}; cout<<"YES\n"; for(long long i=1;i<=n;i++) { long long x = (ans[i].first + ans[i].second) / 2; long long y = ans[i].second - x; cout<<x<<' '<<y<<'\n'; } return 0; }