#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3 + 5;
int readint() {
  int x = 0, f = 1;
  char s = getchar();
  while (s < '0' || s > '9') {
    if (s == '-') f = -1;
    (s = getchar());
  }
  while (s >= '0' && s <= '9') {
    x = (x << 3) + (x << 1) + (s ^ 48);
    (s = getchar());
  }
  return x * f;
}
int a[maxn][2];
int node[maxn << 1];
int dp[maxn << 1][maxn << 1];
vector<int> g[maxn << 1];
int ind[maxn << 1][maxn << 1], vis[maxn << 1][maxn << 1];
int dfs(int l, int r) {
  if (l >= r) {
    return dp[l][r] = 0;
  }
  if (dp[l][r] != -1) {
    return dp[l][r];
  }
  dp[l][r] = dfs(l + 1, r);
  for (int i = 0; i < g[l].size(); i++) {
    int j = g[l][i];
    if (a[j][1] < r) {
      if (dp[l][r] < dfs(l, a[j][1]) + dfs(a[j][1], r)) {
        dp[l][r] = dp[l][a[j][1]] + dp[a[j][1]][r];
        vis[l][r] = j;
      }
    }
  }
  return dp[l][r] += (ind[l][r] ? 1 : 0);
}
vector<int> ans;
void print(int l, int r) {
  if (l >= r) return;
  if (ind[l][r]) ans.push_back(ind[l][r]);
  if (vis[l][r]) {
    print(l, a[vis[l][r]][1]);
    print(a[vis[l][r]][1], r);
  } else
    print(l + 1, r);
}
int main() {
  int n = readint();
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    int x = readint(), r = readint();
    a[i][0] = node[++cnt] = x - r;
    a[i][1] = node[++cnt] = x + r;
  }
  sort(node + 1, node + cnt + 1);
  int m = unique(node + 1, node + cnt + 1) - node - 1;
  for (int i = 1; i <= n; i++) {
    a[i][0] = lower_bound(node + 1, node + m + 1, a[i][0]) - node;
    a[i][1] = lower_bound(node + 1, node + m + 1, a[i][1]) - node;
    g[a[i][0]].push_back(i);
    ind[a[i][0]][a[i][1]] = i;
  }
  memset(dp, -1, sizeof(dp));
  int res = dfs(1, m);
  print(1, m);
  cout << res << endl;
  sort(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); i++) {
    printf("%d ", ans[i]);
  }
  return 0;
}
