#include <bits/stdc++.h>   using namespace std;   const int m = 320;   struct data {     int n, x, a[2 * m + 10];     data *next;   };   data *head;   int get(int value, int limit) {     int ret = 0;     data *k;     for (k = head; k != NULL; k = k->next) {       if (k->x > value) break;       ret += k->n;     }     if (k != NULL)       for (int i = 1; i <= k->n; i++) {         if (k->a[i] > value) break;         ret++;       }     return (min(ret, limit) + 1);   }   void split(data *k) {     data *t = new (data);     t->x = k->x = 0;     for (int i = 1; i <= m; i++) {       t->a[i] = k->a[i + m];       t->x = max(t->x, t->a[i]);       k->x = max(k->x, k->a[i]);     }     k->n = t->n = m;     t->next = k->next;     k->next = t;   }   void insert(int value, int pos) {     if (head == NULL) {       head = new (data);       head->n = 1;       head->x = head->a[1] = value;       head->next = NULL;       return;     }     data *k;     for (k = head; k != NULL; k = k->next) {       if (pos <= k->n + 1) break;       pos -= k->n;     }     for (int i = k->n; i >= pos; i--) k->a[i + 1] = k->a[i];     k->a[pos] = value;     k->x = max(k->x, value);     k->n++;     if (k->n == 2 * m) split(k);   }   int ans[100010], p[100010];   int main() {     int n;     scanf( %d , &n);     for (int i = 1; i <= n; i++) {       int x, y;       scanf( %d%d , &x, &y);       p[x] = i;       int pos = get(x, y);       insert(x, pos);     }     int t = 0;     for (data *k = head; k != NULL; k = k->next)       for (int i = 1; i <= k->n; i++) ans[++t] = k->a[i];     reverse(ans + 1, ans + n + 1);     for (int i = 1; i <= n; i++) printf( %d%c , p[ans[i]], i == n ?   n  :    );     return (0);   }   