#include <iostream>
#include <string>
#include <ctime>


class Date {
 private:
  int year;
  int mouth;
  int day;
  int mouth_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  bool CheckFreeDaysToMoth(int days) {
    return this->mouth_days[this->mouth] >= this->day + days;
  }

 public:
  Date(int year, int mouth, int day) {
    this->day = day;
    this->mouth = mouth;
    this->year = year;
    if (this->year % 400 == 0 ||
        (this->year % 100 != 0 && this->year % 4 == 0))
      this->mouth_days[1]++;
  }
  bool IsLeap() const {
    if (this->year % 400 == 0)
      return true;
    else if (this->year % 100 == 0)
      return false;
    return year % 4 == 0;
  }
  bool operator==(const Date &date) const {
    return this->day == date.day &&
        this->year == date.year &&
        this->mouth == date.mouth;
  }
  bool operator>(const Date &date) const {
    if (this->year > date.year) {
      return true;
    } else if (this->year < date.year) {
      return false;
    } else {
      if (this->mouth > date.mouth) {
        return true;
      } else if (this->mouth < date.mouth) {
        return false;
      } else {
        if (this->day > date.day) {
          return true;
        } else if (this->day < date.day) {
          return false;
        } else {
          return false;
        }
      }
    }
  }
  std::string ToString() {
    std::string t;
    if (this->day < 10) {
      t = "0" + std::to_string(this->day) + ".";
    } else {
      t = std::to_string(this->day) + ".";
    }
    if (this->mouth < 10) {
      t += "0" + std::to_string(this->mouth) + ".";
    } else {
      t += std::to_string(this->mouth) + ".";
    }
    if (this->year < 10) {
      t += "000" + std::to_string(this->year);
    } else if (this->year < 100) {
      t += "00" + std::to_string(this->year);
    } else if (this->year < 1000) {
      t += "0" + std::to_string(this->year);
    } else {
      t += std::to_string(this->year);
    }
    return t;
  }
  Date DaysLater(int days) const {
    int new_day = this->day;
    int new_mouth = (this->mouth + 9) % 12;
    int new_year = this->year - new_mouth / 10;;
    int64_t days_count = 365 * new_year + new_year /
        4 - new_year / 100 + new_year / 400 +
        (new_mouth * 306 + 5) / 10 + (new_day - 1);
    days_count += days;
    new_year = (10000 * days_count + 14780) / 3652425;
    int tmp_day = days_count -
        (365 * new_year + new_year / 4 - new_year / 100 + new_year / 400);
    if (tmp_day < 0) {
      new_year = new_year - 1;
      tmp_day = days_count -
          (365 * new_year + new_year / 4 - new_year / 100 + new_year / 400);
    }
    int tmp_mouth = (100 * tmp_day + 52) / 3060;
    int tmp_new_mouth = (tmp_mouth + 2) % 12 + 1;
    new_year = new_year + (tmp_mouth + 2) / 12;
    int tmp_new_day = tmp_day - (tmp_mouth * 306 + 5) / 10 + 1;
    return Date(new_year, tmp_new_mouth, tmp_new_day);
  }
  int DaysLeft(const Date &date) {
    int k = 0;
    Date tmp_date_new(date.year, date.mouth, date.day);
    Date tmp_date_old(this->year, this->mouth, this->day);
    while (!(tmp_date_new == tmp_date_old)) {
      k++;
      if (tmp_date_new > tmp_date_old) tmp_date_old = tmp_date_old.DaysLater(1);
      else
        tmp_date_new = tmp_date_new.DaysLater(1);
    }
    return k;
  }
};