#include <bits/stdc++.h>
using namespace std;
int n;
vector<pair<int, int> > v;
map<int, int> mp;
int dp[4005][4005];
bool vis[4005][4005];
vector<pair<int, int> > g[4005];
bool has[4005][4005];
int num[4005][4005];
int DP(int l, int r) {
  if (l > r) return 0;
  if (vis[l][r]) return dp[l][r];
  vis[l][r] = 1;
  int res = max(DP(l + 1, r), DP(l, r - 1));
  for (int i = 0; i < g[l].size(); ++i) {
    int mid = g[l][i].first;
    if (mid >= r) break;
    res = max(res, DP(l, mid) + DP(mid, r));
  }
  return dp[l][r] = res + has[l][r];
}
vector<int> ans;
void PD(int l, int r) {
  if (l > r) return;
  if (has[l][r]) ans.push_back(num[l][r] + 1);
  if (dp[l][r] == DP(l + 1, r) + has[l][r]) {
    PD(l + 1, r);
    return;
  }
  if (dp[l][r] == DP(l, r - 1) + has[l][r]) {
    PD(l, r - 1);
    return;
  }
  for (int i = 0; i < g[l].size(); ++i) {
    int mid = g[l][i].first;
    if (mid >= r) break;
    if (dp[l][r] == DP(l, mid) + DP(mid, r) + has[l][r]) {
      PD(l, mid);
      PD(mid, r);
      return;
    }
  }
}
int main() {
  cin >> n;
  for (int i = 0; i < n; ++i) {
    int c, r;
    cin >> c >> r;
    v.emplace_back(c - r, c + r);
    mp[c - r];
    mp[c + r];
  }
  int cnt = 0;
  for (auto it = mp.begin(); it != mp.end(); ++it) it->second = cnt++;
  for (int i = 0; i < n; ++i) {
    int l = mp[v[i].first];
    int r = mp[v[i].second];
    g[l].emplace_back(r, i);
    has[l][r] = 1;
    num[l][r] = i;
  }
  for (int i = 0; i < cnt; ++i) sort(g[i].begin(), g[i].end());
  printf("%d\n", DP(0, cnt - 1));
  PD(0, cnt - 1);
  sort(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); ++i) {
    printf("%d", ans[i]);
    putchar(i + 1 == ans.size() ? '\n' : ' ');
  }
  return 0;
}
