#include <bits/stdc++.h>
using namespace std;
const int Q = 1000 + 10;
const int A = 30 + 1;
const long long dx[] = {0, 1, 0, -1};
const long long dy[] = {1, 0, -1, 0};
struct node {
  long long x, y;
} c[A];
vector<int> v[A];
int f[A][A];
long long num[Q];
int n;
int x, y;
int inn[Q];
bool vis[Q];
void dfs(int x, int cnt) {
  for (int i(0); i < ((int)v[x].size()); ++i) {
    int u = v[x][i];
    if (!vis[u]) {
      vis[u] = true;
      for (int j(0); j < (4); ++j) {
        if (!f[x][j] && !f[u][(j + 2) % 4]) {
          c[u].x = c[x].x + dx[j] * num[cnt];
          c[u].y = c[x].y + dy[j] * num[cnt];
          f[u][(j + 2) % 4] = 1;
          f[x][j] = 1;
          break;
        }
      }
      dfs(u, cnt - 1);
    }
  }
}
int main() {
  num[0] = 1;
  for (int i(1); i <= (36); ++i) num[i] = num[i - 1] * 2;
  scanf("%d", &n);
  for (int i(1); i <= (n - 1); ++i) {
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
    ++inn[x], ++inn[y];
  }
  for (int i(1); i <= (n); ++i)
    if (inn[i] > 4) {
      puts("NO");
      return 0;
    }
  memset(vis, false, sizeof vis);
  vis[1] = true;
  c[1].x = c[1].y = 0;
  dfs(1, 30);
  puts("YES");
  for (int i(1); i <= (n); ++i) {
    printf("%I64d %I64d\n", c[i].x, c[i].y);
  }
}
