#include <iostream>
#include <string>
class Date {
public:
int day, month, year;
explicit Date(int year, int month, int day) {
this->day = day;
this->month = month;
this->year = year;
}
bool IsLeap() const {
if (this->year % 100 == 0 && this->year % 400 != 0) return false;
return this->year % 4 == 0;
}
std::string ToString() const {
std::string _day = this->day < 10 ? "0" +
std::to_string(this->day) :
std::to_string(this->day);
std::string _month = this->month < 10 ? "0" +
std::to_string(this->month) :
std::to_string(this->month);
std::string _year = std::to_string(this->year);
if (this->year < 1000 && this->year > 99)
_year.append("0" + std::to_string(this->year));
if (this->year < 100 && this->year > 9)
_year.append("00" + std::to_string(this->year));
if (this->year < 10)
_year.append("000" + std::to_string(this->year));
return _day + "." + _month + "." + _year;
}
Date DaysLater(int days) const {
int m = this->month, d = this->day, y = this->year;
int m2[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int i, k = 0, p, a;
for (i = 0; i < m; i++)
k = k + m2[i];
k = k + d + days;
int day_in_year = IsLeap() ? 366 : 365;
if (k <= day_in_year) {
if (IsLeap()) m2[2] = 29;
for (i = 0; i < 13; i++) {
p = k - m2[i];
if (p <= m2[i + 1]) {
a = i + 1;
break;
} else {
k = p;
}
}
return Date(y, a, p);
} else {
k = k - day_in_year;
for (i = 0; i < 13; i++) {
p = k - m2[i];
if (p <= m2[i + 1]) {
a = i + 1;
break;
} else {
k = p;
}
}
return Date(y + 1, a, p);
}
}
int DaysLeft(const Date &date) const {
int m = this->month, d = this->day, y = this->year;
if (m < 3) {
y--;
m += 12;
}
int fir = 365 * y + y / 4 - y / 100
+ y / 400 + (153 * m - 457) / 5 + d - 306;
int m1 = date.month, d1 = date.day, y1 = date.year;
if (m1 < 3) {
y1--;
m1 += 12;
}
int sec = 365 * y1 + y1 / 4 - y1 / 100
+ y1 / 400 + (153 * m1 - 457) / 5 + d1 - 306;
return fir > sec ? fir - sec : sec - fir;
}
};