#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, h;
} t[4100];
bool cmp(const node &A, const node &B) {
  if (A.r != B.r) return A.r < B.r;
  return A.l > B.l;
}
map<int, int> M;
int b[4100][4100];
int f[4100], w[4100];
int n, cnt;
int pre[4100][4100][2];
void update(int l, int r, int *e, int pr[4100][2]) {
  for (int i = l; i <= r; i++)
    if (e[i - 1] > e[i]) {
      e[i] = e[i - 1];
      pr[i][0] = pr[i - 1][0];
      pr[i][1] = pr[i - 1][1];
    }
}
int calc(int x) {
  int i, j, k;
  if (w[x]) return w[x];
  int l = t[x].l, r = t[x].r;
  for (i = 1; i <= x - 1; i++) {
    int l = t[i].l, r = t[i].r;
    update(t[i - 1].r + 1, r, b[x], pre[x]);
    if (l < t[x].l) continue;
    if (b[x][r] < b[x][l] + calc(i)) {
      b[x][r] = b[x][l] + calc(i);
      pre[x][r][0] = l;
      pre[x][r][1] = i;
    }
  }
  return w[x] = b[x][t[x - 1].r] + 1;
}
vector<int> A;
void dfs(int x, int pr[4100][2]) {
  while (x) {
    if (pr[x][1]) {
      A.push_back(t[pr[x][1]].h);
      dfs(t[pr[x][1] - 1].r, pre[pr[x][1]]);
    }
    x = pr[x][0];
  }
}
void init() {
  int i, j, k;
  vector<int> L;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%d%d", &j, &k);
    t[i].l = j - k;
    t[i].r = j + k;
    L.push_back(t[i].l);
    L.push_back(t[i].r);
    t[i].h = i;
  }
  sort(t + 1, t + 1 + n, cmp);
  sort(L.begin(), L.end());
  M[L[0]] = 1;
  cnt = 1;
  for (i = 1; i < L.size(); i++)
    if (L[i] != L[i - 1]) M[L[i]] = ++cnt;
  for (i = 1; i <= n; i++) {
    t[i].l = M[t[i].l];
    t[i].r = M[t[i].r];
  }
}
void solve() {
  int i, j, k;
  for (i = 1; i <= n; i++) {
    int l = t[i].l, r = t[i].r;
    update(t[i - 1].r + 1, r, f, pre[0]);
    if (f[r] < f[l] + calc(i)) {
      f[r] = f[l] + calc(i);
      pre[0][r][0] = l;
      pre[0][r][1] = i;
    }
  }
  printf("%d\n", f[t[n].r]);
  dfs(t[n].r, pre[0]);
  sort(A.begin(), A.end());
  for (i = 0; i < A.size(); i++) printf("%d ", A[i]);
  puts("");
}
int main() {
  init();
  solve();
  return 0;
}
