785 50 285 575 10150 275 30 2150 20 40 0100 499999990165 200 4999999900 03245 90 00
# 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;}