#include <bits/stdc++.h>
using namespace std;
bool cmp(deque<int>& d1, deque<int>& d2) {
  for (int i = 0; i < d1.size(); ++i) {
    if (d1[i] != d2[i]) {
      return false;
    }
  }
  return true;
}
const int MAX_N = 51;
enum Conf {
  LETTER = 1,
  DIGIT = 2,
  SPECIAL = 4,
  LETTER_DIGIT = LETTER | DIGIT,
  LETTER_SPECIAL = LETTER | SPECIAL,
  DIGIT_SPECIAL = DIGIT | SPECIAL,
  ALL = LETTER | DIGIT | SPECIAL,
};
template <class Pred>
int find(int start, int inc, Pred pred, const string& str) {
  int res = 0;
  while (start >= 0 && start < str.size()) {
    if (pred(str[start])) {
      return res;
    }
    ++res;
    start += inc;
  }
  return 100;
}
using ll = long long;
int paired(int forbidden) {
  static map<int, int> m = {{0, 1}, {1, 0}, {2, 3}, {3, 2}};
  return m[forbidden];
}
void dfs(int node, int father, int forbidden, ll x, ll y, ll delta,
         vector<pair<ll, ll>>& sol, vector<vector<int>>& g) {
  sol[node] = make_pair(x, y);
  g[node].erase(remove(g[node].begin(), g[node].end(), father), g[node].end());
  vector<pair<ll, ll>> candidates = {
      {x + delta, y}, {x - delta, y}, {x, y + delta}, {x, y - delta}};
  int idx = 0;
  for (int i = 0; i < g[node].size(); ++i) {
    if (idx == forbidden) ++idx;
    dfs(g[node][i], node, paired(idx), candidates[idx].first,
        candidates[idx].second, delta / 2 - 1, sol, g);
    ++idx;
  }
}
void solve(istream& cin) {
  int n;
  cin >> n;
  vector<vector<int>> g(n + 1);
  int x, y;
  for (int i = 0; i < n - 1; ++i) {
    cin >> x >> y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (int i = 1; i <= n; ++i) {
    if (g[i].size() > 4) {
      cout << "NO\n";
      return;
    }
  }
  const ll delta_init = 1LL << 50;
  vector<pair<ll, ll>> sol(n + 1);
  dfs(1, -1, -1, 0, 0, delta_init, sol, g);
  cout << "YES\n";
  for (int i = 1; i <= n; ++i) {
    cout << sol[i].first << ' ' << sol[i].second << endl;
  }
}
int main() {
  solve(cin);
  return 0;
}
