import java.io.*;
import java.util.*;
class Job implements Comparable<Job> {
int i;
long t, d;
Job(int i, long t, long d) {
this.i = i;
this.t = t;
this.d = d;
}
@Override
public int compareTo(Job arg0) {
if (d != arg0.d) {
return new Long(d).compareTo(arg0.d);
} else {
if (t != arg0.t) {
return new Long(t).compareTo(arg0.t);
} else {
return new Integer(i).compareTo(arg0.i);
}
}
}
public String toString() {
return "(" + i + ", " + t + ", " + d + ")";
}
}
class CompareByTimeComparator implements Comparator<Job> {
@Override
public int compare(Job arg0, Job arg1) {
if (arg0.t != arg1.t) {
return new Long(arg0.t).compareTo(arg1.t);
} else {
return new Integer(arg0.i).compareTo(arg1.i);
}
}
}
public class p1sumuProblem {
public static void main(String[] args) throws IOException {
new p1sumuProblem().run();
}
TreeSet<Job> jobs;
long[] b;
int solve() {
TreeSet<Job> result = new TreeSet<Job>();
TreeSet<Job> s = new TreeSet<Job>(new CompareByTimeComparator());
b = new long[jobs.size()];
int time = 0;
for (Job job : jobs) {
s.add(job);
result.add(job);
time += job.t;
if (time > job.d) {
Job pMax = s.pollLast();
result.remove(pMax);
time -= pMax.t;
}
}
Arrays.fill(b, -1);
time = 0;
for (Job job : result) {
b[job.i] = time;
time += job.t;
}
return result.size();
}
void run() throws IOException {
br = new BufferedReader(new FileReader("p1sumu.in"));
pw = new PrintWriter("p1sumu.out");
int n = nextInt();
jobs = new TreeSet<Job>();
for (int i = 0; i < n; i++) {
jobs.add(new Job(i, nextLong(), nextLong()));
}
int result = solve();
pw.println(result);
for (long l : b) {
pw.print(l + " ");
}
pw.close();
}
private BufferedReader br;
private StringTokenizer st;
private PrintWriter pw;
private String next() throws IOException {
while (st == null || !st.hasMoreTokens()) {
st = new StringTokenizer(br.readLine());
}
return st.nextToken();
}
private int nextInt() throws IOException {
return Integer.parseInt(next());
}
private long nextLong() throws IOException {
return Long.parseLong(next());
}
}