9行になりました。

いや、もうこれでオシマイですから。たぶん。
あとはid:mzpの解説待ちだね。

#include<stdio.h>
FILE*i,*o;int x,y=0,W,H,t,u,m[9999][9999]={0},T[]={1,10,21};char s[99];P(p){fpu\
tc(((m[y][x]&(1023<<u*10))>>T[u--])/p,o);}O(p,q){u=2,P(q/4),P(p&1?3:4),P(q&3);}L
(u,d){while(u/=4)m[y+(u/d&3)-1][x+(u&3)-1]+=t;}N(j){m[y][x]+=((t=fgetc(i)<<j*10)
*4),L(400,4),--j&&L(108800,16),x++;}F(){fgets(s,99,i);}main(int c,char**v){if((i
=fopen(v[1],"rb"))&&(o=fopen(v[2],"wb"))&&!strcmp(F(),"P5\n")){while(F()&&*s==35
);sscanf(s,"%d%d",&W,&H);if(atoi(F())==255){while(++y<=H)for(x=1;x<=W;)y&1&&N(2)
,N(1),~y&1&&N(0);fprintf(o,"P6\n%d %d\n255\n",W,H);for(y=x=1;x<=W;x++)O(x,9);wh\
ile(x=1,++y<H){O(y,9);while(++x<W)O(0,10);O(y,9);}while(x<=W)O(~x,6),x++;}}F();}