#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <map>
using namespace std;

string itos(int i){
    stringstream ss;
    ss << i;
    return ss.str();
}

struct Nev {
    string nev;
    string nem;
    int db;
};

struct Ev {
    vector<Nev> nevek;

    void nev_hozzaad(string sor) {
        Nev uj_nev;
        stringstream ss(sor);
        getline(ss, uj_nev.nev, ',');
        getline(ss, uj_nev.nem, ',');
        string szam;
        getline(ss, szam);
        uj_nev.db = atoi(szam.c_str());
        nevek.push_back(uj_nev);
    }

    string legnepszerubb_lany_nev() {
        size_t legnepszerubb_eddig = 0;
        for (size_t i = 1; i < nevek.size(); i++)
            if (nevek[legnepszerubb_eddig].db < nevek[i].db and nevek[i].nem == "F")
                legnepszerubb_eddig = i;
        return nevek[legnepszerubb_eddig].nev;
    }
};

struct Adatbazis {
    vector<Ev> evek;
    const int ELSO_EV = 1880;

    void beolvas(int ev) {
        ifstream f("adatok/yob" + itos(ev) + ".txt");
        if (f.fail())
            cerr << "A yob" << ev << ".txt fájl megnyitása sikertelen!\n";
        string sor;
        evek.push_back(Ev());
        while(getline(f, sor))
            evek[ev-1880].nev_hozzaad(sor);
    }

    void A_csop_1() {
        cout << "A csoport 1.feladat:\n\t";
        Ev vizsgalt_ev = evek[1980-ELSO_EV];
        unsigned szamlalo = 0;
        for (size_t i = 0; i < vizsgalt_ev.nevek.size(); i++)
            if (vizsgalt_ev.nevek[i].nev[0] == 'E' and vizsgalt_ev.nevek[i].nem == "M")
                szamlalo += vizsgalt_ev.nevek[i].db;
        cout << szamlalo << " E betűvel kezdődő nevű fiúgyermek született 1980-ban.\n";
    }

    void A_csop_2() {
        cout << "A csoport 2.feladat:\n\t";
        unsigned i;
        for (i = 0; i < evek.size(); i++)
            if (evek[i].legnepszerubb_lany_nev() != "Mary")
                break;
        cout << i + ELSO_EV << " volt az első év, amikor nem a Mary volt a legnépszerűbb név.\n";
    }

    void A_csop_3() {
        cout << "A csoport 3.feladat:\n\t";
        map<string, int> elso_elofordulas;
        for (size_t i = evek.size()-1; i >=0; i--)
            for (size_t j = 0; j < evek[i].nevek.size(); j++)
                elso_elofordulas[evek[i].nevek[j].nev] = i + ELSO_EV;

        map<int, string> ezredfordulo_utani_nevek;
        for (auto nev_elso_elofordulasa : elso_elofordulas)
            if (nev_elso_elofordulasa.second >= 2000)
                ezredfordulo_utani_nevek[nev_elso_elofordulasa.second] = nev_elso_elofordulasa.first;

        cout << ezredfordulo_utani_nevek.begin()->first << " volt a legnépszerűbb olyan név, amelyik 2000-ben vagy azután jelent meg.\n";
    }
};

int main() {
    setlocale(LC_ALL, "");
    Adatbazis adatbazis;
    cout << "Adatok beolvasása megkezdődött...\n";
    for (int ev = 1880; ev <= 2016; ev++)
        adatbazis.beolvas(ev);
    cout << "Adatok beolvasása sikeresen megtörtént.\n";
    adatbazis.A_csop_1();
    adatbazis.A_csop_2();
    adatbazis.A_csop_3();
}
