#include <bits/stdc++.h>
using namespace std;
const int MAXN = 30 + 1;
vector<int> g[MAXN];
int d[MAXN];
struct Node {
  long long x, y;
  Node(long long _x = 0, long long _y = 0) : x(_x), y(_y){};
  void print() { printf("%lld %lld\n", x, y); }
};
Node a[MAXN];
int dr[] = {0, 1, 0, -1};
int dc[] = {-1, 0, 1, 0};
void dfs(int u, long long mul, int direct) {
  int v, ban = 5, di = direct;
  if (u != 1) {
    if (direct == 0 || direct == 2)
      ban = 2 - direct;
    else
      ban = 4 - direct;
  }
  for (int i = 0; i < g[u].size(); i++) {
    v = g[u][i];
    if (!d[v]) {
      a[v].x = a[u].x + mul * dr[di];
      a[v].y = a[u].y + mul * dc[di];
      d[v] = 1;
      dfs(v, (mul >> 1), di);
      di = (di + 1) % 4;
      if (di == ban) di = (di + 1) % 4;
    }
  }
}
int main() {
  int n;
  scanf("%d", &n);
  int u, v;
  for (int i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 1; i <= n; i++)
    if (g[i].size() > 4) {
      puts("NO");
      return 0;
    }
  puts("YES");
  memset(d, 0, sizeof d);
  a[1] = Node(0, 0);
  d[1] = 1;
  dfs(1, (1ll << 30), 0);
  for (int i = 1; i <= n; i++) a[i].print();
  return 0;
}
