#include <bits/stdc++.h>
using namespace std;
const int MAXN = 31;
int n;
long long ansx[MAXN], ansy[MAXN];
namespace Tree {
int head[MAXN], nxt[MAXN << 1], to[MAXN << 1], eidx = 0;
int deg[MAXN] = {0};
bool check = true;
void init() { memset(head, -1, sizeof(head)); }
void adde(int u, int v) {
  if (++deg[u] > 4 || ++deg[v] > 4) check = false;
  to[eidx] = v;
  nxt[eidx] = head[u];
  head[u] = eidx++;
  to[eidx] = u;
  nxt[eidx] = head[v];
  head[v] = eidx++;
}
}  // namespace Tree
int dirx[] = {-1, 1, 0, 0};
int diry[] = {0, 0, -1, 1};
int oppod[] = {1, 0, 3, 2};
void dfs(int u, int fa, int fd, long long delta, long long x, long long y) {
  using namespace Tree;
  ansx[u] = x;
  ansy[u] = y;
  int nxtd = 0;
  for (int e = head[u]; ~e; e = nxt[e]) {
    int v = to[e];
    if (v == fa) continue;
    if (nxtd == fd) ++nxtd;
    long long nxtx = x + ((long long)1 << delta) * dirx[nxtd];
    long long nxty = y + ((long long)1 << delta) * diry[nxtd];
    dfs(v, u, oppod[nxtd++], delta - 1, nxtx, nxty);
  }
}
int main() {
  scanf("%d", &n);
  Tree::init();
  for (int i = 0; i < n - 1; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    Tree::adde(u, v);
  }
  if (!Tree::check) {
    puts("NO");
    return 0;
  } else
    puts("YES");
  dfs(1, -1, -1, 31, 0, 0);
  for (int i = 1; i <= n; ++i) printf("%I64d %I64d\n", ansx[i], ansy[i]);
  return 0;
}
