#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

struct esemeny{
    string kod, ido, akcio;
    // akcio: 1- belépés, 2 - kilépés, 3 - menza, 4 - könyvtár
};

struct oraperc
{
    int ora, perc;
};

void F1(vector<esemeny> &a)
{
    ifstream fbe;
    fbe.open("bedat.txt");
    esemeny temp;
    while(fbe >> temp.kod and fbe >> temp.ido and fbe >> temp.akcio)
    {
        a.push_back(temp);
    }
    fbe.close();
}

void F2(vector<esemeny> &a)
{
    cout << "2. feladat" << endl;
    cout << "Az első tanuló " << a[0].ido << "-kor lépett be a főkapun." << endl;
    cout << "Az utolsó tanuló " << a[a.size()-1].ido << "-kor lépett ki a főkapun. " << endl;
}

void F3(vector<esemeny> a)
{
    // 07:50 után, de legkésőbb 08:15-kor
    string start = "07:50";
    string vege  = "08:15";
    ofstream fki;
    fki.open("kesok.txt");
    for(auto akc:a)
    {
        if(akc.akcio == "1" && (akc.ido > start && akc.ido <= vege))
        {
            fki << akc.ido << " " << akc.kod << endl;
        }
    }
    fki.close();

}

void F4(vector<esemeny> a)
{
    cout << "4. feladat" << endl;
    int fo=0;
    for(auto akc:a)
    {
        if(akc.akcio == "3") fo++;
    }
    cout << "A menzán aznap " << fo << " tanuló ebédelt. " << endl;
}

void F5(vector<esemeny> a)
{
    cout << "5. feladat" << endl;
    set<string> konyvtar;
    for(auto akc:a)
    {
        if(akc.akcio == "4") konyvtar.insert(akc.kod);
    }
    cout << "Aznap " << konyvtar.size() << " tanuló kölcsönzött a könyvtárban." << endl;
    vector<string> menza;
    for(auto akc:a)
    {
        if(akc.akcio == "3") menza.push_back(akc.kod);
    }
    if(konyvtar.size()>menza.size())
    {
        cout << "Többen voltak, mint a menzán." << endl;
    }
    else
    {
        cout << "Nem voltak többen, mint a menzán." << endl;
    }
}
bool kodszerint(esemeny a, esemeny b)
{
    return a.kod < b.kod;
}

void F6(vector<esemeny> a)
{
    cout << "6. feladat" << endl;
    cout << "Az érintett tanulók:" << endl;

    set<string> diakok;
    for(auto akc:a)
    {
        diakok.insert(akc.kod);
    }
    string start = "10:50";             // hátsó kapu zárása
    string vege  = "11:00";             // szünet vége

    sort(a.begin(), a.end(),kodszerint);
    bool szabalytalan;
    vector<string> tmp;
    int be, ki;
    for(auto diak:diakok)
    {
        tmp.clear();
        szabalytalan = false;
        for(auto akc:a)
        {
            if(akc.kod == diak && (akc.akcio == "1" or akc.akcio == "2"))
            {
                tmp.push_back(akc.akcio);
                if(akc.akcio == "1" && (akc.ido > start && akc.ido < vege)) szabalytalan = true;
            }
        }
        be = count(tmp.begin(), tmp.end(), "1");
        ki = count(tmp.begin(), tmp.end(), "2");
        if(be > ki && szabalytalan) cout << diak << " ";
    }
    cout << endl;
}

oraperc ido(string k, string v)
{
    oraperc tmp;
    int k_ora = stoi(k.substr(0,2));
    int v_ora = stoi(v.substr(0,2));
    int k_perc = stoi(k.substr(3,2));
    int v_perc = stoi(v.substr(3,2));
    tmp.ora = ((v_ora * 60 + v_perc) - (k_ora * 60 + k_perc)) / 60;
    tmp.perc = ((v_ora * 60 + v_perc) - (k_ora * 60 + k_perc)) % 60;
    return tmp;
}

void F7(vector<esemeny> a)
{
    cout << "7. feladat" << endl;
    string diak, be, ki;
    oraperc it;
    bool van = false;
    cout << "Egy tanuló azonosítója = ";
    cin >> diak;
    int i=0;
    while(i < a.size() && a[i].kod != diak) i++;
    if(i < a.size())
    {
        van = true;
        be = a[i].ido;
    }
    i = a.size()-1;
    while(i >= 0 && a[i].kod != diak) i--;

    if(van)
    {
        ki = a[i].ido;
        it = ido(be, ki);
        cout << "A tanuló érkezése és távozása között " <<  it.ora << " óra " << it.perc << " perc telt el." << endl;
    }
    else
    {
        cout << "Ilyen azonosítójú tanuló aznap nem volt az iskolában." << endl;
    }
}

int main()
{
    setlocale(LC_ALL, "");

    vector<esemeny> akciok;
    F1(akciok);
    F2(akciok);
    F3(akciok);
    F4(akciok);
    F5(akciok);
    F6(akciok);
    F7(akciok);

    return 0;
}
