#include <bits/stdc++.h>
using namespace std;
const int inf = 1000 * 1000 * 1000;
int dp[4096][4096];
int way[4096][4096];
map<int, int> mp;
int ID(int x) {
  if (mp[x] == 0) mp[x] = mp.size();
  return mp[x] - 1;
}
struct edge {
  int a, b;
  int id, val;
  vector<int> res;
};
int n;
vector<edge> e;
vector<int> t;
vector<int> ar[4009];
inline bool cmp(const edge &a, const edge &b) {
  return (a.b - a.a < b.b - b.a);
}
int DP(int L, int R) {
  int &res = dp[R][L];
  if (res != -1) return res;
  if (L == R) {
    res = 0;
    return res;
  }
  res = 0;
  int t = 0;
  t = max(t, DP(L + 1, R));
  way[R][L] = -1;
  for (int i = 0; i < ar[L].size(); i++) {
    if (e[ar[L][i]].b > R) continue;
    if (t < e[ar[L][i]].val + DP(e[ar[L][i]].b, R)) {
      t = e[ar[L][i]].val + DP(e[ar[L][i]].b, R);
      way[R][L] = i;
    }
  }
  res += t;
  return res;
}
vector<int> Way(int L, int R) {
  int t = way[R][L];
  vector<int> res;
  if (L == R) return res;
  if (t == -1) return Way(L + 1, R);
  res.push_back(ar[L][t]);
  int to = e[ar[L][t]].b;
  vector<int> z = Way(to, R);
  res.insert(res.end(), (z).begin(), (z).end());
  return res;
}
void go(int x) {
  if (x != e.size() - 1) printf("%d ", e[x].id + 1);
  for (int i = 0; i < e[x].res.size(); i++) {
    go(e[x].res[i]);
  }
}
int main() {
  memset(dp, -1, sizeof(dp));
  ;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int c, r;
    scanf("%d%d", &c, &r);
    edge ed;
    ed.a = (c - (r));
    ed.b = (c + (r));
    t.push_back(ed.a);
    t.push_back(ed.b);
    ed.id = i;
    ed.val = 1;
    e.push_back(ed);
  }
  {
    edge ed;
    ed.a = -2 * inf;
    ed.b = 2 * inf + 10;
    t.push_back(-2 * inf);
    t.push_back(2 * inf + 10);
    ed.val = 1;
    ed.id = n;
    n++;
    e.push_back(ed);
  }
  sort((t).begin(), (t).end());
  t.resize(unique((t).begin(), (t).end()) - t.begin());
  for (int i = 0; i < t.size(); i++) ID(t[i]);
  for (int i = 0; i < e.size(); i++) {
    e[i].a = ID(e[i].a);
    e[i].b = ID(e[i].b);
  }
  sort((e).begin(), (e).end(), cmp);
  for (int i = 0; i < e.size(); i++) {
    memset(&dp[e[i].b], -1, 4 * 4096);
    e[i].val = 1 + DP(e[i].a, e[i].b);
    ar[e[i].a].push_back(i);
    e[i].res.clear();
    e[i].res = Way(e[i].a, e[i].b);
  }
  printf("%d\n", e.back().val - 1);
  go(e.size() - 1);
  return 0;
}
