#include <bits/stdc++.h>
#pragma comment(linker, "/stack:64000000")
using namespace std;
template <typename first>
inline first abs(const first& a) {
  return a < 0 ? -a : a;
}
template <typename first>
inline first sqr(const first& a) {
  return a * a;
}
const long double PI = 3.1415926535897932384626433832795;
const long double EPS = 1e-9;
const int INF = 1000 * 1000 * 1000;
const int N = 2000 + 13;
int n;
pair<int, int> s[N];
int xs[2 * N], sz;
map<int, int> tonum;
vector<pair<int, int> > g[2 * N];
int z[2 * N][2 * N];
int solve(int lf, int rg) {
  int& res = z[lf][rg];
  if (res != -1) return res;
  if (lf == rg) return 0;
  res = solve(lf + 1, rg);
  int dx = 0;
  for (int i = 0; i < int(int((g[lf]).size())); i++) {
    int to = g[lf][i].first;
    if (to == rg) {
      dx = 1;
      continue;
    }
    if (to < rg) res = max(res, solve(lf, to) + solve(to, rg));
  }
  return res += dx;
}
void write(int lf, int rg) {
  int dx = 0, id = -1;
  for (int i = 0; i < int(int((g[lf]).size())); i++)
    if (g[lf][i].first == rg) {
      dx = 1;
      id = g[lf][i].second;
      break;
    }
  if (id != -1) printf("%d ", id + 1);
  for (int i = 0; i < int(int((g[lf]).size())); i++) {
    int to = g[lf][i].first;
    if (to >= rg) continue;
    if (z[lf][rg] == z[lf][to] + z[to][rg] + dx) {
      write(lf, to);
      write(to, rg);
      return;
    }
  }
  if (z[lf][rg] == z[lf + 1][rg] + dx) write(lf + 1, rg);
}
int main() {
  cin >> n;
  for (int i = 0; i < int(n); i++) {
    int x, r;
    scanf("%d%d", &x, &r);
    s[i] = make_pair((x - r), (x + r));
    xs[sz++] = x - r;
    xs[sz++] = x + r;
  }
  sort(xs, xs + sz);
  sz = int(unique(xs, xs + sz) - xs);
  for (int i = 0; i < int(sz); i++) tonum[xs[i]] = i;
  for (int i = 0; i < int(n); i++)
    g[tonum[s[i].first]].push_back(make_pair((tonum[s[i].second]), (i)));
  memset(z, -1, sizeof(z));
  int t = solve(0, sz - 1);
  cout << t << endl;
  write(0, sz - 1);
  return 0;
}
