Problem: Phoenix is trying to take a photo of his n friends with labels 1, 2, ..., n who are lined up in a row in a special order. But before he can take the photo, his friends get distracted by a duck and mess up their order.

Now, Phoenix must restore the order but he doesn't remember completely! He only remembers that the i-th friend from the left had a label between a_i and b_i inclusive. Does there exist a unique way to order his friends based of his memory? 

Input

The first line contains one integer n (1 ≤ n ≤ 2⋅10^5) — the number of friends.

The i-th of the next n lines contain two integers a_i and b_i (1 ≤ a_i ≤ b_i ≤ n) — Phoenix's memory of the i-th position from the left.

It is guaranteed that Phoenix's memory is valid so there is at least one valid ordering.

Output

If Phoenix can reorder his friends in a unique order, print YES followed by n integers — the i-th integer should be the label of the i-th friend from the left.

Otherwise, print NO. Then, print any two distinct valid orderings on the following two lines. If are multiple solutions, print any.

Examples

Input


4
4 4
1 3
2 4
3 4


Output


YES
4 1 2 3 


Input


4
1 3
2 4
3 4
2 3


Output


NO
1 3 4 2 
1 2 4 3 

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
pair<int, int> intervals[MAXN];
vector<pair<int, int> > add_to_q[MAXN];
int ordered_friends[MAXN];
int minimum[MAXN][20];
int ans[MAXN];
int query(int l, int r) {
  if (l > r) return 2e9;
  int cur = l;
  int ans = 2e9;
  for (int i = 19; i >= 0; i--) {
    if ((1 << i) & (r - l + 1)) {
      ans = min(ans, minimum[cur][i]);
      cur += (1 << i);
    }
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> intervals[i].first >> intervals[i].second;
  for (int i = 1; i <= n; i++) {
    add_to_q[intervals[i].first].push_back(
        pair<int, int>(intervals[i].second, i));
  }
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      pq;
  for (int i = 1; i <= n; i++) {
    for (pair<int, int> j : add_to_q[i]) pq.push(j);
    ordered_friends[i] = pq.top().second;
    pq.pop();
  }
  for (int i = 1; i <= n; i++)
    minimum[i][0] = intervals[ordered_friends[i]].first;
  for (int i = 1; i <= 19; i++) {
    for (int j = 1; j <= n; j++) {
      minimum[j][i] = minimum[j][i - 1];
      if (j + (1 << (i - 1)) <= n)
        minimum[j][i] = min(minimum[j][i], minimum[j + (1 << (i - 1))][i - 1]);
    }
  }
  for (int i = n; i >= 1; i--) {
    if (i + 1 <= intervals[ordered_friends[i]].second) {
      if (query(i + 1, intervals[ordered_friends[i]].second) <= i) {
        cout << "NO" << '\n';
        for (int i = 1; i <= n; i++) ans[ordered_friends[i]] = i;
        for (int i = 1; i <= n; i++) cout << ans[i] << ' ';
        cout << '\n';
        for (int j = i + 1; j <= intervals[ordered_friends[i]].second; j++) {
          if (intervals[ordered_friends[j]].first <= i) {
            swap(ans[ordered_friends[i]], ans[ordered_friends[j]]);
            break;
          }
        }
        for (int i = 1; i <= n; i++) cout << ans[i] << ' ';
        return 0;
      }
    }
  }
  cout << "YES" << '\n';
  for (int i = 1; i <= n; i++) ans[ordered_friends[i]] = i;
  for (int i = 1; i <= n; i++) cout << ans[i] << ' ';
  return 0;
}