#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f, mod = 1000000007;
const double pi = 3.1415926535897932, eps = 1e-6;
int n, dp[4005][4005], id[4005][4005];
map<int, int> M;
int m;
struct seg {
  int l, r;
} s[2005];
vector<int> va[4005], ans;
bool cmp(seg x, seg y) {
  if (x.r != y.r) return x.r < y.r;
  return x.l > y.l;
}
int dfs(int l, int r) {
  if (dp[l][r] != -1) return dp[l][r];
  if (l == r) return dp[l][r] = 0;
  int cur = 0, len = va[r].size();
  if (id[l][r] != -1) cur = 1;
  int ans = cur + dfs(l, r - 1);
  for (int(i) = (0); (i) <= (len - 1); (i)++) {
    int x = s[va[r][i]].l;
    if (x <= l) continue;
    int tmp = dfs(l, x) + dfs(x, r) + cur;
    ans = max(ans, tmp);
  }
  return dp[l][r] = ans;
}
void path(int l, int r) {
  if (l == r) return;
  int cur = 0, len = va[r].size();
  if (id[l][r] != -1) {
    cur = 1;
    ans.push_back(id[l][r]);
  }
  if (dp[l][r] == cur + dp[l][r - 1]) {
    path(l, r - 1);
    return;
  }
  for (int(i) = (0); (i) <= (len - 1); (i)++) {
    int x = s[va[r][i]].l;
    if (x <= l) continue;
    if (dp[l][x] + dp[x][r] + cur == dp[l][r]) {
      path(l, x);
      path(x, r);
      return;
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int(i) = (1); (i) <= (n); (i)++) {
    int t1, t2;
    scanf("%d%d", &t1, &t2);
    s[i].l = t1 - t2;
    s[i].r = t1 + t2;
    M[s[i].l] = M[s[i].r] = 0;
  }
  for (map<int, int>::iterator it = M.begin(); it != M.end(); it++) {
    it->second = m;
    m++;
  }
  for (int(i) = (0); (i) <= (m); (i)++)
    for (int(j) = (0); (j) <= (m); (j)++) dp[i][j] = -1, id[i][j] = -1;
  for (int(i) = (1); (i) <= (n); (i)++) {
    s[i].l = M[s[i].l];
    s[i].r = M[s[i].r];
    id[s[i].l][s[i].r] = i;
    va[s[i].r].push_back(i);
  }
  printf("%d\n", dfs(0, m - 1));
  path(0, m - 1);
  int aa = ans.size();
  for (int(i) = (0); (i) <= (aa - 1); (i)++) printf("%d ", ans[i]);
  return 0;
}
