PKU 2080 Calendar

http://poj.org/problem?id=2080
2000年1月1日からの日数が入力されるので、年月日に変換してついでに曜日も表示する。

面倒くさい日付計算をあまりしたくなかったので、最初localtimeとか使おうとしたのですが、REが出てうまくいかなかったり、2038年問題に直面して9999年とかが出なかったりしたので、以下の方針に転換。
intだとMLEだったので、shortにしたら通った。よかった。

char youbi[][10]={"Sunday","Monday","Tuesday",
		  "Wednesday","Thursday","Friday","Saturday"};

int mon[]={31,29,31,30,31,30,31,31,30,31,30,31};

short year[4000000],month[4000000],day[4000000];

main(){
  int y=2000,m=1,d=1;
  rep(i,4000000){
    year[i]=y;
    month[i]=m;
    day[i]=d;
    if(m==12 && d==31){
      y++;
      m=1;
      d=1;
      if((y%4==0 && y%100!=0) || y%400==0)mon[1]=29;
      else mon[1]=28;
      continue;
    }

    if(d==mon[m-1]){
      ++m;
      d=0;
    }
    ++d;
  }
  ll n;
  while(cin>>n,~n)
    printf("%d-%02d-%02d %s\n",year[n],month[n],day[n],youbi[(n+6)%7]);
}