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