#include <bits/stdc++.h>
using namespace std;
using lint = long long;
using pi = pair<int, int>;
const int MAXN = 50005;
const int MAXT = 132000;
pi merge(pi a, pi b) {
  if (a < b) swap(a, b);
  if (a.first == b.first) a.second = min(a.second, b.second);
  return a;
}
int n;
struct seg {
  pi tree[MAXT];
  int lazy[MAXT];
  void lazydown(int p) {
    for (int i = 2 * p; i < 2 * p + 2; i++) {
      tree[i].first += lazy[p];
      lazy[i] += lazy[p];
    }
    lazy[p] = 0;
  }
  void init(int s = 0, int e = n, int p = 1) {
    lazy[p] = 0;
    if (s == e) {
      tree[p] = pi(0, s);
      return;
    }
    int m = (s + e) / 2;
    init(s, m, 2 * p);
    init(m + 1, e, 2 * p + 1);
    tree[p] = merge(tree[2 * p], tree[2 * p + 1]);
  }
  pi query(int s, int e, int ps = 0, int pe = n, int p = 1) {
    if (e < ps || pe < s) return pi(-1e9, 0);
    if (s <= ps && pe <= e) return tree[p];
    lazydown(p);
    int pm = (ps + pe) / 2;
    return merge(query(s, e, ps, pm, 2 * p),
                 query(s, e, pm + 1, pe, 2 * p + 1));
  }
  void add(int s, int e, int x, int ps = 0, int pe = n, int p = 1) {
    if (e < ps || pe < s) return;
    if (s <= ps && pe <= e) {
      tree[p].first += x;
      lazy[p] += x;
      return;
    }
    lazydown(p);
    int pm = (ps + pe) / 2;
    add(s, e, x, ps, pm, 2 * p);
    add(s, e, x, pm + 1, pe, 2 * p + 1);
    tree[p] = merge(tree[2 * p], tree[2 * p + 1]);
  }
} seg;
pi a[MAXN];
vector<int> lvl[MAXN];
int ans[MAXN], f[MAXN];
bool trial(int k) {
  for (int i = 0; i < n; i++) lvl[i].clear();
  for (int i = 0; i < n; i++) {
    f[i] = n - 1;
    lvl[n - 1].push_back(i);
  }
  seg.init();
  for (int i = 0; i < n; i++) {
    seg.add(i + 1, n, ((int)(lvl[i]).size()) - 1);
  }
  for (int i = 0; i < n; i++) {
    auto val = seg.query(i + 1, n);
    if (val.first > -i) return 0;
    int lastpos = val.second;
    pi ret(2e9, -1);
    for (int j = i; j < lastpos; j++) {
      for (auto &k : lvl[j]) {
        ret = min(ret, pi(a[k].second, k));
      }
    }
    int idx = ret.second;
    ans[i] = idx;
    lvl[f[idx]].erase(find((lvl[f[idx]]).begin(), (lvl[f[idx]]).end(), idx));
    seg.add(f[idx] + 1, n, -1);
    if (k + i < n - 1) {
      vector<int> aux;
      for (auto &x : lvl[n - 1]) {
        if (a[x].first <= a[idx].second) {
          f[x] = k + i;
          lvl[k + i].push_back(x);
          seg.add(k + i + 1, n - 1, 1);
        } else
          aux.push_back(x);
      }
      lvl[n - 1] = aux;
    }
  }
  return 1;
}
void solve() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d %d", &a[i].first, &a[i].second);
  int s = 1, e = n - 1;
  while (s != e) {
    int m = (s + e) / 2;
    if (trial(m))
      e = m;
    else
      s = m + 1;
  }
  trial(s);
  for (int i = 0; i < n; i++) printf("%d ", 1 + ans[i]);
}
int main() {
  int tc = 1;
  while (tc--) {
    solve();
  }
}
