#include<stdio.h>
#include<stdlib.h>
extern void u(void);
extern int il(unsigned int yr);
static unsigned int m2d(unsigned int mn);
static long y2d(unsigned int yr);
extern long ymd2s (unsigned int yr,unsigned int mo,unsigned int day);
static int d[12]={31,28,31,30,31,30,31,31,30,31,30,31};
static char*mn[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
static char*dn[8]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
static const char *line="";

void u(void)
{
	puts("u: CAL m y");
	puts("where: m = mn (1 - 12)");
	puts("       y = year (1 - 99, 1800 - 3000)");
	exit(EXIT_FAILURE);
}
int main(int argc,char*argv[]){
int day,day_1,numd,i,j;
unsigned yr,mo;
if(3>argc)
u();
yr=(unsigned)atoi(argv[2]);
mo=(unsigned)atoi(argv[1]);
if(!mo||12<mo)u();
if(100>yr)yr+=1900;
if(3000<yr||1800>yr)u();
for(i=0,mo-=1;i<3;++i,++mo){
if(!mo){mo=12;--yr;}
if(12<mo){mo=1;++yr;
}
numd=d[mo-1];
if(2==mo &&il(yr))
++numd;
day_1=(int)((ymd2s(yr,mo,1)-(long)0)%7L);
fputs(line,stdout);
for(j=0;j<7;)
{fputs(dn[0+j],stdout);
if(7!=++j)
fputc(' ',stdout);
}
printf("%s < %s, %d\n%s",line,mn[mo-1],yr,line);
for(day=0;day<day_1;++day)
fputs("    ",stdout);
for(day=1;day<=numd;++day,++day_1,day_1%=7){
if(!day_1&&1!=day)
printf("\b%s\n%s",line,line);
printf("%3d ",day);}
for(;day_1;++day_1,day_1%=7)
fputs("    ",stdout);
fputc('\n',stdout);
}
return 0;
}
int il(unsigned yr){
	return yr%4==0&&(yr%100!=0||yr%400==0);}

static unsigned m2d(unsigned m)
	{
	return(m*3057U-3007U)/100U;
	}

static long y2d (unsigned yr)
	{
	return(long)(yr*365L+yr/4-yr/100+yr/400);}

long ymd2s(unsigned yr,unsigned mo,unsigned day)
	{long scalar;
	scalar=(long)(day+m2d(mo));
	if(mo>2)scalar-=il(yr)?1:2;
	yr--;
	scalar+=y2d(yr);
	return scalar;
	}