#include <bits/stdc++.h>
using namespace std;
static const double EPS = 1e-12;
short mem[4000][4000][2];
int toMem[4000][4000][2];
void normalize(vector<pair<int, int> > &inputs) {
  int size = inputs.size();
  vector<int> w;
  for (int i = 0; i < (size); ++i) {
    w.push_back(inputs[i].first);
    w.push_back(inputs[i].second);
  }
  sort(w.begin(), w.end());
  w.erase(unique(w.begin(), w.end()), w.end());
  map<int, int> ch;
  for (int i = 0; i < (int)(w.size()); ++i) ch[w[i]] = i;
  for (int i = 0; i < (int)(inputs.size()); ++i) {
    inputs[i].first = ch[inputs[i].first];
    inputs[i].second = ch[inputs[i].second];
  }
}
short solve(vector<vector<int> > &craters, int left, int right, bool used) {
  if (left >= right) return 0;
  short &ret = mem[left][right][used];
  if (ret < 0) {
    int to = -1;
    ret = solve(craters, left + 1, right, false);
    for (int i = 0; i < (int)(craters[left].size()); ++i)
      if (craters[left][i] < right || (!used && craters[left][i] == right)) {
        short cand = solve(craters, left, craters[left][i], true) +
                     solve(craters, craters[left][i], right, false) + 1;
        if (cand > ret) {
          ret = cand;
          to = i;
        }
      }
    toMem[left][right][used] = to;
  }
  return ret;
}
void getAns(vector<vector<int> > &craters, vector<vector<int> > &indexes,
            int left, int right, bool used, vector<int> &ans) {
  if (left >= right) return;
  int to = toMem[left][right][used];
  if (to == -1)
    getAns(craters, indexes, left + 1, right, false, ans);
  else {
    getAns(craters, indexes, left, craters[left][to], true, ans);
    getAns(craters, indexes, craters[left][to], right, false, ans);
    ans.push_back(indexes[left][to]);
  }
}
int main(void) {
  int size;
  cin >> size;
  vector<pair<int, int> > inputs(size);
  for (int i = 0; i < (size); ++i) {
    int c, r;
    cin >> c >> r;
    inputs[i].first = c - r;
    inputs[i].second = c + r;
  }
  normalize(inputs);
  int maxS = INT_MIN;
  for (int i = 0; i < (size); ++i) maxS = max(maxS, inputs[i].second);
  vector<vector<int> > craters(maxS + 1);
  vector<vector<int> > indexes(maxS + 1);
  for (int i = 0; i < (size); ++i) {
    craters[inputs[i].first].push_back(inputs[i].second);
    indexes[inputs[i].first].push_back(i + 1);
  }
  memset(mem, -1, sizeof(mem));
  cout << solve(craters, 0, maxS, false) << endl;
  vector<int> ans;
  getAns(craters, indexes, 0, maxS, false, ans);
  for (int i = 0; i < (int)(ans.size()); ++i) {
    if (i) cout << " ";
    cout << ans[i];
  }
  cout << endl;
  return 0;
}
