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 N = 2 * 1e5 + 5;
int sol[N];
struct ajutorab {
  int a, b;
  int id;
};
bool operator<(ajutorab x, ajutorab y) {
  if (x.b == y.b) return x.id < y.id;
  return x.b < y.b;
}
bool cmp(ajutorab a, ajutorab b) { return a.a < b.a; }
bool cmpid(ajutorab a, ajutorab b) { return a.id < b.id; }
ajutorab v[N];
set<ajutorab> pz;
int aint[4 * N];
void update(int node, int l, int r, int poz, int val) {
  if (l > r || poz < l || poz > r) return;
  if (l == r) {
    aint[node] = val;
    return;
  }
  int mid = (l + r) / 2;
  update(2 * node, l, mid, poz, val);
  update(2 * node + 1, mid + 1, r, poz, val);
  aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
int query(int node, int l, int r, int ql, int qr) {
  if (l > r || qr < l || ql > r || ql > qr) return -1;
  if (ql <= l && r <= qr) {
    return aint[node];
  }
  int mid = (l + r) / 2;
  int st = query(2 * node, l, mid, ql, qr);
  int dr = query(2 * node + 1, mid + 1, r, ql, qr);
  return max(st, dr);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> v[i].a >> v[i].b;
    v[i].id = i;
  }
  sort(v + 1, v + n + 1, cmp);
  int poz = 1;
  for (int i = 1; i <= n; i++) {
    while (poz <= n && v[poz].a <= i) {
      pz.insert(v[poz]);
      poz++;
    }
    ajutorab x = (*pz.begin());
    pz.erase(pz.begin());
    sol[x.id] = i;
  }
  sort(v + 1, v + n + 1, cmpid);
  for (int i = 1; i <= n; i++) {
    update(1, 1, n, sol[i], v[i].b);
  }
  for (int i = 1; i <= n; i++) {
    int q = query(1, 1, n, v[i].a, sol[i] - 1);
    if (q >= sol[i]) {
      cout << "No\n";
      for (int j = 1; j <= n; j++) {
        cout << sol[j] << " ";
      }
      cout << "\n";
      for (int j = 1; j <= n; j++) {
        if (j != i && v[i].a <= sol[j] && sol[j] <= sol[i] &&
            sol[i] <= v[j].b) {
          swap(sol[i], sol[j]);
          break;
        }
      }
      for (int j = 1; j <= n; j++) {
        cout << sol[j] << " ";
      }
      return 0;
    }
  }
  cout << "Yes\n";
  for (int j = 1; j <= n; j++) {
    cout << sol[j] << " ";
  }
  return 0;
}