#include <stdio.h>
#define YEAR 2000

int main() {
   int y; 
   int day[12] = {-5, -1, -1, -4, 1, -2, -4, 0, -3, -5, -1, -3}; 
   int max[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   char mnth[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", 
                       "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
   int offset;
   int d, i, m, w, g;

   printf("Year: ");
   scanf("%d", &y);

   // --------------- Updating in Case of Leap Year -------------
   if (y % 4 == 0) {
      max[1] = 29; 
      for (i = 2; i < 12; i++) {
         day[i]--;
      }
   }

   // ---- Calculating the Offset Compared to Starting Year -----
   offset = (y - YEAR + (y - YEAR + 3)/4) % 7;

   // ---- Adjusting the Starting Day Offsets for Each Month ----
   for (i = 0; i < 12; i++) {
      day[i] -= offset;
      if (day[i] < -5)
         day[i] += 7;
   }

   // ------------ Printing Out the Calendar Itself --------------
   printf("\n                                  %d\n\n", y);
   
   // ------- For Each of Four Blocks of Three Months --------
   for (g = 0; g < 12; g +=3) {

      // ----- Print out Heading Lines for the Months --------
      for (i = 0; i < 3; i++) {
         printf("            %s        ", mnth[g + i]);
      }
      printf("\n");
      for (i = 0; i < 3; i++) {
         printf("    S  M  T  W  R  F  S"); 
      }
      printf("\n");

      // ------ For Each of 6 Possible Weeks in a Month ------
      for (w = 0; w < 7; w++) {

         // ------- For Each Month in a Block of Three -------
         for (m = 0; m < 3; m++) {
            printf("  ");

            // ----- For Each Day in a Week ------------------
            for (d = 0; d < 7; d++) {
               if (day[m+g] < 1 || day[m+g] > max[m+g]) {
                  printf("   ");
               }
               else {
                  printf("%3d", day[m+g]);
               }
               day[m+g]++;
            }
         }
         printf("\n");
      }
   }
   printf("\n");
   return 0;
}

