#include <bits/stdc++.h>
using namespace std;
int rnd() {
  static int KEY = 12345678;
  return KEY += KEY << 2 | 1;
}
int n, m;
int vis[1000001];
int top = 0;
int v[1000001];
int anss[1000001];
void print(pair<int, pair<int, int> > x) {
  printf("X:%d   Y.X:%d   Y.Y:%d \n", x.first, x.second.first, x.second.second);
}
struct Treap {
  struct node {
    pair<int, pair<int, int> > val;
    int key, size;
    node *c[2];
    node(pair<int, pair<int, int> > _val, node *C) {
      val = _val;
      key = rnd();
      c[0] = c[1] = C;
      size = 1;
    }
    void rz() { size = c[0]->size + c[1]->size + 1; }
  };
  node *root, *Null;
  Treap() {
    Null = new node(pair<int, pair<int, int> >(0, make_pair(0, 0)), 0);
    Null->size = 0;
    Null->key = INT_MAX;
    Null->c[0] = Null->c[1] = Null;
    root = Null;
  }
  void rot(node *&t, bool d) {
    node *p = t->c[d];
    t->c[d] = p->c[!d];
    p->c[!d] = t;
    t->rz();
    p->rz();
    t = p;
  }
  void _insert(node *&t, pair<int, pair<int, int> > x) {
    if (t == Null) {
      t = new node(x, Null);
      return;
    }
    bool d = x > t->val;
    _insert(t->c[d], x);
    if (t->c[d]->key < t->key)
      rot(t, d);
    else
      t->rz();
  }
  void _del(node *&t, pair<int, pair<int, int> > x) {
    if (t == Null) return;
    if (t->val == x) {
      bool d = t->c[0]->key > t->c[1]->key;
      if (t->c[d] == Null) {
        delete t;
        t = Null;
        return;
      }
      rot(t, d);
      _del(t->c[!d], x);
    } else {
      bool d = x > t->val;
      _del(t->c[d], x);
    }
    t->rz();
  }
  pair<int, pair<int, int> > _kth(node *&t, int x) {
    int r = t->c[0]->size;
    if (x == r) return t->val;
    if (x < r) return _kth(t->c[0], x);
    return _kth(t->c[1], x - r - 1);
  }
  void insert(pair<int, pair<int, int> > x) { _insert(root, x); }
  void del(pair<int, pair<int, int> > x) { _del(root, x); }
  pair<int, pair<int, int> > kth(int x) { return _kth(root, x); }
  void _deb(node *&t) {
    print(t->val);
    printf("L:");
    print(t->c[0]->val);
    printf("R:");
    print(t->c[1]->val);
    if (t->c[0] != Null) _deb(t->c[0]);
    if (t->c[1] != Null) _deb(t->c[1]);
  }
  void deb() { _deb(root); }
  int size() { return root->size; }
  pair<int, pair<int, int> > Min() {
    node *p = root;
    while (p->c[0] != Null) p = p->c[0];
    return p->val;
  }
} T;
void Run() {
  anss[0] = 0;
  while (T.size()) {
    pair<int, pair<int, int> > k = T.Min();
    anss[k.second.first] = k.second.second;
    if (~k.second.second) v[k.second.second] = 1;
    T.del(k);
  }
}
int main() {
  srand(10086);
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    T.insert(pair<int, pair<int, int> >(i, make_pair(i, -1)));
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    pair<int, pair<int, int> > k = T.kth(y - 1);
    if (k.second.second == -1) {
      if (vis[x]) {
        puts("-1");
        return 0;
      }
      vis[x] = 1;
    } else {
      if (k.second.second != x) {
        puts("-1");
        return 0;
      }
    }
    T.insert(pair<int, pair<int, int> >(top--, make_pair(k.second.first, x)));
    T.del(k);
  }
  Run();
  int p = 0;
  for (int i = 1; i <= n; i++) {
    if (~anss[i])
      printf("%d ", anss[i]);
    else {
      p++;
      while (v[p]) p++;
      printf("%d ", p);
    }
  }
  return 0;
}
