#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
const int MAXN = 4010;
vector<pair<int, int> > seg;
vector<int> unq, edl[MAXN];
int dp[MAXN][MAXN];
int hs[MAXN][MAXN];
int trf[MAXN][MAXN];
inline int dfs(int l, int r) {
  if (l >= r) return dp[l][r] = 0;
  if (~dp[l][r]) return dp[l][r];
  dp[l][r] = dfs(l + 1, r), trf[l][r] = -1;
  for (auto v : edl[l])
    if (v < r) {
      if (dp[l][r] < dfs(l, v) + dfs(v, r)) {
        trf[l][r] = v;
        dp[l][r] = dfs(l, v) + dfs(v, r);
      }
    }
  return (dp[l][r] += bool(hs[l][r]));
}
inline void print(int l, int r) {
  if (l >= r) return;
  if (hs[l][r]) {
    cout << hs[l][r] << ' ';
  }
  if (dp[l][r] <= 0) return;
  if (trf[l][r] != -1) {
    print(l, trf[l][r]);
    print(trf[l][r], r);
  } else {
    print(l + 1, r);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL), cout.tie(NULL);
  int n;
  cin >> n;
  for (register int i = (1); i <= (n); ++i) {
    int o, r;
    cin >> o >> r;
    unq.push_back(o - r);
    unq.push_back(o + r);
    seg.push_back(pair<int, int>(o - r, o + r));
  }
  sort((unq).begin(), (unq).end());
  unq.erase(unique((unq).begin(), (unq).end()), unq.end());
  for (register int i = (0); i <= (n - 1); ++i) {
    auto& sg = seg[i];
    sg.first = lower_bound((unq).begin(), (unq).end(), sg.first) - unq.begin();
    sg.second =
        lower_bound((unq).begin(), (unq).end(), sg.second) - unq.begin();
    hs[sg.first][sg.second] = i + 1, edl[sg.first].push_back(sg.second);
  }
  memset(dp, -1, sizeof(dp));
  cout << dfs(0, (int((unq).size())) - 1) << '\n';
  print(0, (int((unq).size())) - 1);
  return 0;
}
