#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007LL;
long long base = 10000007;
long long large = 1000000000000000000LL;
vector<vector<long long> > addv;
int ul, ur;
long long uv1, uv2;
void update(int o, int l, int r) {
  if (ul <= l && ur >= r) {
    addv[o][0] += uv1;
    addv[o][1] += uv2;
  } else {
    int m = (l + r) / 2;
    if (ul <= m) update(o * 2, l, m);
    if (ur > m) update(o * 2 + 1, m + 1, r);
  }
}
int qp, re;
void query(int o, int l, int r, long long add1, long long add2) {
  add1 += addv[o][0];
  add2 += addv[o][1];
  if (l == r) {
    re = add1 * l + add2;
  } else {
    int m = (l + r) / 2;
    if (qp <= m) query(o * 2, l, m, add1, add2);
    if (qp > m) query(o * 2 + 1, m + 1, r, add1, add2);
  }
}
int main() {
  int n;
  cin >> n;
  vector<int> s(n, 0), g(n, 0);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &s[i], &g[i]);
    s[i] += i;
  }
  int ub = s[0] + g[0];
  int lb = s[0];
  for (int i = 1; i < n; i++) {
    ub += 2;
    ub = min(ub, s[i] + g[i]);
    lb = max(lb, s[i]);
    if (lb > ub) {
      cout << -1 << endl;
      return 0;
    }
    g[i] = min(g[i], ub - s[i]);
  }
  long long ans = 0;
  vector<int> e(n, 0);
  for (int i = n - 1; i >= 0; i--) {
    ub = min(ub, s[i] + g[i]);
    e[i] = ub - i;
    ans += 1LL * (ub - s[i]);
  }
  cout << ans << endl;
  for (int i = 0; i < n; i++) cout << e[i] << " ";
  return 0;
}
