#include <iostream> 
#include <fstream>

struct Date {
    int day, month, year;
};

int cmp(const Date& a, const Date& b) {
    if (a.year != b.year) {
        return a.year < b.year ? -1 : 1;
    } else if (a.month != b.month) {
        return a.month < b.month ? -1 : 1;
    } else if (a.day != b.day) {
        return a.day < b.day ? -1 : 1;
    }
    return 0;
}

int EnterOption() {
    std::cout << "Choose 2 options:\n";
    std::cout << "1. Save an array of dates to binary file\n";
    std::cout << "2. Load the array of dates from binary file\n";
    std::cout << "Enter option index: ";
    int option;
    std::cin >> option;
    return option;
}

void saveDatesToBinFile() {
    int n;
    std::cout << "Enter n: ";
    std::cin >> n;
    Date* dates = new Date[n]();
    std::cout << "Enter days line by line (dd mm yyyy):\n";
    for (int i = 0; i < n; ++i) {
        std::cin >> dates[i].day >> dates[i].month >> dates[i].year;
    }

    std::ofstream fout("input.bin", std::ios::binary);
    fout.write((char*)&n, sizeof(int));
    fout.write((char*)dates, sizeof(Date)*n);
    fout.close();
}

Date loadDatesFromBinFileAndFindNewest() {
    std::ifstream fin("input.bin", std::ios::binary);
    int n;
    fin.read((char*)&n, sizeof(int));
    Date* dates = new Date[n]();
    fin.read((char*)dates, sizeof(Date)*n);

    int id = -1;
    for (int i = 0; i < n; ++i) {
        if (id == -1 || cmp(dates[id], dates[i])) {
            id = i;
        }
    }

    return id == -1 ? Date{-1,-1,-1} : dates[id];
}

int main() {
    int option;
    int failFlag = false;
    do {
        option = EnterOption();
        if (option == 1) {
            saveDatesToBinFile();
        } else if (option == 2) {
            Date newest = loadDatesFromBinFileAndFindNewest();
            if (newest.day == -1) {
                std::cout << "There is no date in data file\n";
            } else {
                std::cout << "The newest date is: ";
                std::cout << newest.day << "/" << newest.month << "/" << newest.year << '\n';
            }
        } else {
            std::cout << "Invalid Option!!\n";
            failFlag = true;
        }
    } while (failFlag);
    return 0;
}