#include <iostream>

class Date {
 public:
    Date(int year, int month, int day) {
        this->year = year;
        if (this->year % 4 || (this->year % 100 == 0 && this->year % 400)) {
            this->leapy = false;
        } else {
            this->leapy = true;
        }
        this->month = month;
        this->day = day;
    }
    bool IsLeap() const {
        return this->leapy;
    }
    std::string ToString() const {
        std::string d, m, y, result;
        d = std::to_string(this->day);
        if (this->day < 10)
            d = '0' + d;
        m = std::to_string(this->month);
        if (this->month < 10)
            m = '0' + m;
        y = std::to_string(this->year);
        if (this->year < 1000 && this->year > 99)
            y = '0' + y;
        if (this->year < 100 && this->year > 9)
            y = "00" + y;
        if (this->year < 10 && this->year > 0)
            y = "000" + y;
        result = d + "." + m + "." + y;
        return result;
    }
    Date DaysLater(int days) const {
        int days_mas[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int day = this->day, month = this->month, year = this->year;
        if (leapy) {
            days_mas[1] = 29;
        }
          while (days > 0) {
            if (leapy) {
                if (days > 366) {
                    year++;
                    days -= 366;
                } else {
                    while (days > 31) {
                        days -= days_mas[month - 1];
                        month++;
                        if (month == 13) {
                            month = 1;
                            year++;
                            if (year % 4 || (year % 100 == 0 && year % 400))
                                days_mas[1] = 28;
                            else
                                days_mas[1] = 29;
                        }
                    }
                    day += days;
                    if (day > days_mas[month - 1]) {
                        day -= days_mas[month - 1];
                        month++;
                        if (month == 13) {
                            month = 1;
                            year++;
                        }
                    }
                    days = 0;
                }
            } else {
                if (days > 365) {
                    year++;
                    days -= 365;
                } else {
                    while (days > 31) {
                        days -= days_mas[month - 1];
                        month++;
                        if (month == 13) {
                            month = 1;
                            year++;
                            if (year % 4 || (year % 100 == 0 && year % 400))
                                days_mas[1] = 28;
                            else
                                days_mas[1] = 29;
                        }
                    }
                    day += days;
                    if (day > days_mas[month - 1]) {
                        day -= days_mas[month - 1];
                        month++;
                        if (month == 13) {
                            month = 1;
                            year++;
                        }
                    }
                    days = 0;
                }
        }
    }
    return Date(year, month, day);
  }
    int DaysLeft(const Date& date) const {
        int days[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (leapy)
            days[1] = 29;
        int days_result, yd, d_zero, md_current = 0, md_future = 0;
        yd = date.year - this->year;
        d_zero = yd / 4;
        if (leapy)
            days_result = yd * 366;
        else
            days_result = yd * 365;
        days_result += d_zero;
        for (int i = 0; i < this->month - 1; ++i)
            md_current += days[i];
        for (int i = 0; i < date.month - 1; ++i)
            md_future += days[i];
        days_result = days_result - md_current + md_future +
        (date.day - this->day < 0 ?
        this->day - date.day : date.day - this->day);
        return days_result;
    }

 private:
  int year, month, day;
  bool leapy;
};