tellg 近辺を削除できたので、37バイト縮まりました。
本当に、7行いけるかもしれませんねぇ。嘘みたいだ。
4バイト入出力は、しかし、意外と難しそうです。

#include <fstream>
typedef unsigned L;typedef unsigned char C;L W,O,u,i,l,R=-1,K;main(L,char**V){
L b=256,a[b],R=-1,c;C*t=new C[1<<24];ifstream g(V[2]);ofstream o(V[3]);while(u
<b)a[u++]=1;if(*V[1]-68){for(;(c=g.get())<256;K=W,l++){for(b=0;b<c;W+=R/u*a[b
++]);if(K>W)for(K=O;!++t[--K];);for(R=R/u++*a[c]++;R<1<<24;R<<=8)t[O++]=W>>24,
W<<=8;}o.write(&l,4);o.write(t,O);o<<C(W>>24)<<C(W>>16)<<C(W>>8)<<C(W);}else{g
.read(&l,4);g.read(t,4);for(W=*t<<24|t[1]<<16|t[2]<<8|t[3];i<l;R*=a[b]++){for(
K=b=0;R<1<<24;R<<=8,O++)W=W<<8|g.get();for(R/=u++;W/R>=K;K+=a[b++]);W-=R*(K-a[
t[i++]=--b]);}o.write(t,l);}}