#include <bits/stdc++.h>
using namespace std;
int n, u, v, i, flag;
vector<int> adj[31];
bool mark[31];
map<pair<long long, long long>, bool> visited;
map<int, pair<long long, long long> > ans;
void dfs(int curr, long long par_x, long long par_y, char ch, long long len) {
  if (mark[curr]) return;
  mark[curr] = true;
  long long x, y;
  if (flag) return;
  if (!visited[{par_x + len, par_y}] && ch != 'l') {
    ch = 'r';
    x = par_x + len;
    y = par_y;
  } else if (!visited[{par_x - len, par_y}] && ch != 'r') {
    ch = 'l';
    x = par_x - len;
    y = par_y;
  } else if (!visited[{par_x, par_y + len}] && ch != 'd') {
    ch = 'u';
    x = par_x;
    y = par_y + len;
  } else if (!visited[{par_x, par_y - len}] && ch != 'u') {
    ch = 'd';
    x = par_x;
    y = par_y - len;
  } else {
    flag = 1;
    return;
  }
  for (int j = 0; j < adj[curr].size(); j++) {
    visited[{x, y}] = true;
    ans[curr].first = x;
    ans[curr].second = y;
    dfs(adj[curr][j], x, y, ch, len / 4);
  }
}
int main() {
  long long x = 0, y = 0, ch = 'z';
  cin >> n;
  for (i = 0; i < n - 1; i++) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  visited[{0, 0}] = true;
  ans[1] = {0, 0};
  mark[1] = true;
  for (i = 0; i < adj[1].size(); i++) dfs(adj[1][i], x, y, ch, 1LL << 58);
  if (flag) return cout << "NO", 0;
  cout << "YES" << endl;
  for (i = 1; i <= n; i++) cout << ans[i].first << " " << ans[i].second << endl;
}
