7
85 5
0 2
85 5
75 10
150 2
75 3
0 2
150 2
0 4
0 0
10
0 499999990
165 20
0 499999990
0 0
3
245 9
0 0
0
# include <stdio.h>
# include <stdlib.h>
# include <memory.h>
# define min(a,b) (a) < (b) ? (a) : (b)
int pix[1001], begin[1001], sum;
int ans[2012];
int cha[2012];
int cnt;
int w;
int *around;
int getPix (int nd) {
int p = 0, r = cnt + 1;
if (begin[r] <= nd) return r;
while (p + 1 < r) {
int mid = (p + r) >> 1;
if (begin[r] == nd) return r;
if (begin[mid] > nd) {
r = mid;
}
else if (begin[mid] < nd) {
p = mid;
}
else return mid;
}
return p;
}
int abs(int a) {
return a > 0 ? a : -a;
}
int getMax (int nd) {
int max = 0;
int l = 0, r = 8;
if (nd % w == 0) r = 5;
if (nd % w == 1) l = 3;
if (w == 1) {r = 5; l = 3;}
for (int i = l; i < r; ++ i) {
int t = nd + around[i];
if (t <= sum && t > 0) {
int m = pix[getPix(nd)];
int c = abs(pix[getPix(t)] - m);
max = max > c ? max : c;
}
}
return max;
}
int findEnd (int nd) {
int index = getPix (nd);
return begin[index + 1] - 1;
}
int getRow(int nd) {
return (nd - 1) / w + 1;
}
int getCol(int nd) {
return nd - (getRow(nd) - 1) * w;
}
int getPos (int row, int col) {
return w * (row - 1) + col;
}
int next (int nd) {
int a, b, c;
a = b = c = findEnd(nd);
if (nd - w > 0)
b = findEnd(nd - w);
if (nd + w <= sum)
c = findEnd(nd + w);
int row_a = getRow(a), col_a = getCol(a);
int row_b = getRow(b), col_b = getCol(b);
int row_c = getRow(c), col_c = getCol(c);
int row_nd = getRow(nd);// col_nd = getCol(nd);
if (a == b && b == c && nd - w > 0 && nd + w <= sum && row_c - 3 >= row_nd) return getPos(row_c - 2, w);
if (row_b >= row_nd) col_b = w;
if (row_c > row_nd + 1) col_c = w;
if (row_a > row_nd) col_a = w;
int col_min = min(col_a, min(col_b, col_c));
return getPos(row_nd, col_min);
}
int main () {
while ( (scanf("%d", &w), w) ) {
int a[] = {-1, -1 + w, -1 - w, w, -w, 1 + w, 1, 1 - w};
around = a;
int x, y;
cnt = -1;
sum = 0;
begin[0] = 1;
memset (cha, 0, sizeof(cha));
memset (ans, 0, sizeof(ans));
while ( (scanf ("%d %d", &x, &y), x + y ) ) {
pix[++ cnt] = x;
begin[cnt + 1] = begin[cnt] + y;
sum += y;
}
int anscnt = 0;
/*
for (int i = 1; i <= sum; ++ i) {
printf ("%d ", getMax(i));
if (i % w == 0) printf ("\n");
}
*/
int p = 2;
cha[0] = getMax(1);
ans[0] = 1;
while (p <= sum) {
int mp = getMax(p);
int tmp = next(p);
if (mp == cha[anscnt]) {
ans[anscnt] += tmp - p + 1;
}
else {
cha[++ anscnt] = mp;
ans[anscnt] = tmp - p + 1;
}
if (getMax(tmp) != getMax(tmp - 1) && (tmp - p) >=1 ) {
-- ans[anscnt];
cha [++ anscnt] = getMax(tmp);
ans[anscnt] = 1;
}
p = tmp + 1;
if(p > sum) break;
if (getMax(p) == cha[anscnt]) ++ ans[anscnt];
else {
cha[++ anscnt] = getMax(p);
ans[anscnt] = 1;
}
++ p;
}
printf ("%d\n", w);
for (int i = 0; i <= anscnt; ++ i) {
printf ("%d %d\n", cha[i], ans[i]);
}
printf ("0 0\n");
}
printf ("0\n");
return 0;
}