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
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
long long gcd(long long a, long long b) {
  if (a == 0) return b;
  if (b == 0) return a;
  return gcd(b % a, a);
}
long long pow(long long a, long long b) {
  if (b == 0) return 1;
  if (b == 1) return a;
  long long half = pow(a, b / 2);
  long long ans = (half * half);
  if (b % 2) {
    ans = (ans * a);
  }
  return ans;
}
long long get_num(long long idx, vector<vector<long long> > &V,
                  vector<long long> &N) {
  long long num_of_childs = V[idx].size();
  if (num_of_childs == 0) {
    N[idx] = 0;
    return N[idx];
  }
  long long total_count = 0;
  for (long long i = 0; i < num_of_childs; ++i) {
    total_count += get_num(V[idx][i], V, N) + 1;
  }
  N[idx] = total_count;
  return total_count;
}
void get_ans(long long idx, vector<vector<long long> > &V, vector<long long> &C,
             vector<long long> &Ans, set<long long> &S) {
  long long num_of_childs = V[idx].size();
  long long found_val = *std::next(S.begin(), C[idx]);
  Ans[idx] = found_val;
  S.erase(found_val);
  for (long long i = 0; i < num_of_childs; ++i) {
    get_ans(V[idx][i], V, C, Ans, S);
  }
}
int main() {
  long long n, x;
  cin >> n;
  long long root = -1;
  vector<vector<long long> > V(n, vector<long long>());
  vector<long long> C(n);
  vector<long long> N(n), Ans(n);
  set<long long> S;
  for (long long i = 0; i < n; ++i) {
    cin >> x >> C[i];
    if (x != 0) {
      V[--x].push_back(i);
    } else {
      root = i;
    }
    S.insert(i + 1);
  }
  bool all_valid = true;
  get_num(root, V, N);
  for (long long i = 0; i < n; ++i) {
    if (C[i] > N[i]) {
      all_valid = false;
      break;
    }
  }
  if (!all_valid) {
    cout << "NO" << endl;
    return 0;
  }
  cout << "YES" << endl;
  get_ans(root, V, C, Ans, S);
  for (long long i = 0; i < n; ++i) {
    cout << Ans[i] << " ";
  }
  cout << endl;
  return 0;
}
