#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2 * 2000 + 10;
int n;
vector<pair<int, int> > seg;
int dp[MAXN][MAXN];
int par[MAXN][MAXN];
int srt[MAXN];
inline bool cmp(int i, int j) {
  return seg[i].first != seg[j].first ? seg[i].first < seg[j].first
                                      : seg[i].second < seg[j].second;
}
vector<int> xs;
inline int gid(int x) {
  return lower_bound(xs.begin(), xs.end(), x) - xs.begin();
}
set<pair<int, int> > val;
void output(int l, int r) {
  val.insert(pair<int, int>(l, r));
  if (r - l > 1) {
    output(par[l][r], r);
    output(l, par[l][r]);
  }
}
void solve() {
  for (int ln = 1; ln < xs.size(); ln++) {
    int p = 0;
    for (int l = 0; l + ln < xs.size(); l++) {
      int r = l + ln;
      int &mx = dp[l][r] = dp[l + 1][r];
      int &pr = par[l][r] = l + 1;
      while (p < n && seg[srt[p]] < pair<int, int>(l, r)) {
        int d = dp[l][seg[srt[p]].second] + dp[seg[srt[p]].second][r];
        if (d > mx) {
          mx = d;
          pr = seg[srt[p]].second;
        }
        p++;
      }
      while (p < n && seg[srt[p]] == pair<int, int>(l, r)) mx++, p++;
    }
  }
}
void init() {
  for (int i = 0; i < n; i++)
    xs.push_back(seg[i].first), xs.push_back(seg[i].second);
  sort(xs.begin(), xs.end());
  xs.resize(unique(xs.begin(), xs.end()) - xs.begin());
  for (int i = 0; i < n; i++)
    seg[i].first = gid(seg[i].first), seg[i].second = gid(seg[i].second);
  for (int i = 0; i < n; i++) srt[i] = i;
  sort(srt, srt + n, cmp);
}
void input() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int c, r;
    cin >> c >> r;
    seg.push_back(pair<int, int>(c - r, c + r));
  }
}
int main() {
  input();
  init();
  solve();
  cout << dp[0][xs.size() - 1] << endl;
  output(0, xs.size() - 1);
  for (int i = 0; i < n; i++)
    if (val.find(seg[i]) != val.end()) cout << i + 1 << " ";
  cout << endl;
  return 0;
}
