#include <bits/stdc++.h>
using namespace std;
int n;
const int maxn = 4005;
map<pair<int, int>, int> mapa;
pair<int, int> axis[maxn];
int dp[maxn][maxn], pre[maxn][maxn];
vector<int> to[maxn], vec;
int nn;
void init_lisanhua() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int c, r;
    cin >> c >> r;
    axis[i].first = c - r;
    axis[i].second = c + r;
    vec.push_back(axis[i].first);
    vec.push_back(axis[i].second);
  }
  sort(vec.begin(), vec.end());
  vec.erase(unique((vec).begin(), (vec).end()), vec.end());
  nn = vec.size();
  for (int i = 1; i <= n; i++) {
    axis[i].first = lower_bound((vec).begin(), (vec).end(), axis[i].first) -
                    vec.begin() + 1;
    axis[i].second = lower_bound((vec).begin(), (vec).end(), axis[i].second) -
                     vec.begin() + 1;
    to[axis[i].first].push_back(axis[i].second);
    mapa[axis[i]] = i;
  }
  for (int i = 1; i <= nn; i++) {
    sort(to[i].begin(), to[i].end());
  }
}
void print(int x, int y) {
  if (mapa.count(make_pair(x, y))) cout << mapa[make_pair(x, y)] << ' ';
  if (x >= y) return;
  if (pre[x][y] == -1)
    print(x + 1, y);
  else {
    print(x, to[x][pre[x][y]]);
    print(to[x][pre[x][y]], y);
  }
}
void solve() {
  init_lisanhua();
  for (int len = 2; len <= nn; len++) {
    for (int i = 1; i <= nn - len + 1; i++) {
      int j = i + len - 1;
      dp[i][j] = dp[i + 1][j];
      pre[i][j] = -1;
      bool flag = false;
      for (int k = 0; k < to[i].size(); k++) {
        int tmp = to[i][k];
        if (tmp == j) flag = 1;
        if (tmp >= j) break;
        if (dp[i][j] < dp[i][tmp] + dp[tmp][j]) {
          dp[i][j] = dp[i][tmp] + dp[tmp][j];
          pre[i][j] = k;
        }
      }
      dp[i][j] += flag;
    }
  }
  cout << dp[1][nn] << endl;
  print(1, nn);
}
int main() {
  solve();
  return 0;
}
