#include <bits/stdc++.h>
using namespace std;
template <typename T, typename V>
void bugp(const pair<T, V> &x) {
  cerr << '{' << x.first << ", " << x.second << '}' << endl;
}
template <typename T, typename U, typename V>
void bugpp(const pair<T, pair<U, V> > &x) {
  cerr << '{' << x.first << ", {" << x.second.first << ", " << x.second.second
       << "}}" << endl;
}
template <typename T>
bool maximize(T &x, const T &y) {
  if (x < y) {
    x = y;
    return 1;
  }
  return 0;
}
template <typename T>
bool minimize(T &x, const T &y) {
  if (x > y) {
    x = y;
    return 1;
  }
  return 0;
}
const int N = 2002;
int n, Max[N << 2], lazy[N << 2], C[N], A[N], subsz[N];
bool answer = 1;
vector<int> child[N];
void build(int x = 1, int l = 1, int r = n) {
  if (l == r) return void(Max[x] = l);
  int mid = l + r >> 1;
  build(x << 1, l, mid);
  build(x << 1 | 1, mid + 1, r);
  Max[x] = max(Max[x << 1], Max[x << 1 | 1]);
}
void propagate(int x) {
  int &t = lazy[x];
  Max[x << 1] += t;
  lazy[x << 1] += t;
  Max[x << 1 | 1] += t;
  lazy[x << 1 | 1] += t;
  t = 0;
}
void update(int u, int v, int c, int x = 1, int l = 1, int r = n) {
  if (u > r || v < l) return;
  if (u <= l && r <= v) {
    Max[x] += c;
    lazy[x] += c;
    return;
  }
  int mid = l + r >> 1;
  propagate(x);
  update(u, v, c, x << 1, l, mid);
  update(u, v, c, x << 1 | 1, mid + 1, r);
  Max[x] = max(Max[x << 1], Max[x << 1 | 1]);
}
int getpos(int val, int x = 1, int l = 1, int r = n) {
  if (l == r) {
    if (Max[x] == val) return l;
    return -1;
  }
  int mid = l + r >> 1;
  propagate(x);
  if (Max[x << 1] >= val) return getpos(val, x << 1, l, mid);
  return getpos(val, x << 1 | 1, mid + 1, r);
}
void DFS(int u) {
  if (!answer) return;
  A[u] = getpos(C[u] + 1);
  if (A[u] == -1) {
    answer = 0;
    return;
  }
  update(A[u], n, -1);
  subsz[u] = 1;
  for (const int &v : child[u]) {
    DFS(v);
    subsz[u] += subsz[v];
  }
  if (C[u] >= subsz[u]) answer = 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  int root;
  for (int i = 1, _n = (n); i <= _n; ++i) {
    int p;
    cin >> p >> C[i];
    if (p)
      child[p].push_back(i);
    else
      root = i;
  }
  build();
  DFS(root);
  if (answer) {
    cout << "YES\n";
    for (int i = 1, _n = (n); i <= _n; ++i) cout << A[i] << ' ';
  } else
    cout << "NO";
  return 0;
}

### Prompt

Your challenge is to write a cpp solution to the following problem:

Evlampiy was gifted a rooted tree. The vertices of the tree are numbered from 1 to n. Each of its vertices also has an integer a_i written on it. For each vertex i, Evlampiy calculated c_i — the number of vertices j in the subtree of vertex i, such that a_j < a_i. 

<image>Illustration for the second example, the first integer is a_i and the integer in parentheses is c_i

After the new year, Evlampiy could not remember what his gift was! He remembers the tree and the values of c_i, but he completely forgot which integers a_i were written on the vertices.

Help him to restore initial integers!

Input

The first line contains an integer n (1 ≤ n ≤ 2000) — the number of vertices in the tree.

The next n lines contain descriptions of vertices: the i-th line contains two integers p_i and c_i (0 ≤ p_i ≤ n; 0 ≤ c_i ≤ n-1), where p_i is the parent of vertex i or 0 if vertex i is root, and c_i is the number of vertices j in the subtree of vertex i, such that a_j < a_i.

It is guaranteed that the values of p_i describe a rooted tree with n vertices.

Output

If a solution exists, in the first line print "YES", and in the second line output n integers a_i (1 ≤ a_i ≤ {10}^{9}). If there are several solutions, output any of them. One can prove that if there is a solution, then there is also a solution in which all a_i are between 1 and 10^9.

If there are no solutions, print "NO".

Examples

Input


3
2 0
0 2
2 0


Output


YES
1 2 1 

Input


5
0 1
1 3
2 1
3 0
2 0


Output


YES
2 3 2 1 2

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
template <typename T, typename V>
void bugp(const pair<T, V> &x) {
  cerr << '{' << x.first << ", " << x.second << '}' << endl;
}
template <typename T, typename U, typename V>
void bugpp(const pair<T, pair<U, V> > &x) {
  cerr << '{' << x.first << ", {" << x.second.first << ", " << x.second.second
       << "}}" << endl;
}
template <typename T>
bool maximize(T &x, const T &y) {
  if (x < y) {
    x = y;
    return 1;
  }
  return 0;
}
template <typename T>
bool minimize(T &x, const T &y) {
  if (x > y) {
    x = y;
    return 1;
  }
  return 0;
}
const int N = 2002;
int n, Max[N << 2], lazy[N << 2], C[N], A[N], subsz[N];
bool answer = 1;
vector<int> child[N];
void build(int x = 1, int l = 1, int r = n) {
  if (l == r) return void(Max[x] = l);
  int mid = l + r >> 1;
  build(x << 1, l, mid);
  build(x << 1 | 1, mid + 1, r);
  Max[x] = max(Max[x << 1], Max[x << 1 | 1]);
}
void propagate(int x) {
  int &t = lazy[x];
  Max[x << 1] += t;
  lazy[x << 1] += t;
  Max[x << 1 | 1] += t;
  lazy[x << 1 | 1] += t;
  t = 0;
}
void update(int u, int v, int c, int x = 1, int l = 1, int r = n) {
  if (u > r || v < l) return;
  if (u <= l && r <= v) {
    Max[x] += c;
    lazy[x] += c;
    return;
  }
  int mid = l + r >> 1;
  propagate(x);
  update(u, v, c, x << 1, l, mid);
  update(u, v, c, x << 1 | 1, mid + 1, r);
  Max[x] = max(Max[x << 1], Max[x << 1 | 1]);
}
int getpos(int val, int x = 1, int l = 1, int r = n) {
  if (l == r) {
    if (Max[x] == val) return l;
    return -1;
  }
  int mid = l + r >> 1;
  propagate(x);
  if (Max[x << 1] >= val) return getpos(val, x << 1, l, mid);
  return getpos(val, x << 1 | 1, mid + 1, r);
}
void DFS(int u) {
  if (!answer) return;
  A[u] = getpos(C[u] + 1);
  if (A[u] == -1) {
    answer = 0;
    return;
  }
  update(A[u], n, -1);
  subsz[u] = 1;
  for (const int &v : child[u]) {
    DFS(v);
    subsz[u] += subsz[v];
  }
  if (C[u] >= subsz[u]) answer = 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  int root;
  for (int i = 1, _n = (n); i <= _n; ++i) {
    int p;
    cin >> p >> C[i];
    if (p)
      child[p].push_back(i);
    else
      root = i;
  }
  build();
  DFS(root);
  if (answer) {
    cout << "YES\n";
    for (int i = 1, _n = (n); i <= _n; ++i) cout << A[i] << ' ';
  } else
    cout << "NO";
  return 0;
}

```