#include <iostream>         // cin, cout
#include <fstream>          // fájlkezelés
#include <vector>           // vector adattípus
#include <iomanip>          // setprecision

using namespace std;

int F1(vector<pair<int, string>> &ut)
{
    ifstream fbe;
    fbe.open("ut.txt");
    int h;
    fbe >> h;
    pair<int, string> p;
    while(fbe >> p.first >> p.second)
    {
        ut.push_back(p);
    }
    fbe.close();
    return h;
}

void F2(vector<pair<int, string>> ut)
{
    for(auto p: ut)
    {
        if(p.second.size() > 3) cout << p.second << endl;
    }
}

bool csakszamok(string j)
{
    if (j.empty()) return false;

    for(char c : j) {
        if (!isdigit(c)) {
            return false;
        }
    }
    return true;
}

void F3(vector<pair<int, string>> ut)
{
    float vkm;
    cout << "Adja meg a vizsgált szakasz hosszát km-ben! ";
    cin >> vkm;
    float vm = vkm * 1000;
    int min_sebesseg = 90;
    bool varosban = false;
    string jel;
    int sebesseg, x;
    for(auto szakasz: ut)                      // szakasz: <szám, jel> pár
    {
        jel = szakasz.second;
        if(szakasz.first < vm)
        {
            if(csakszamok(jel)) sebesseg = stoi(jel);       // stoi - string to integer
            if(jel.size() > 3)
            {
                varosban = true;
                sebesseg = 50;
            }
            if(jel == "]")
            {
                varosban = false;
                sebesseg = 90;
            }
            if(jel == "#" || jel == "%")
            {
                sebesseg = varosban ? 50 : 90;
            }

            if(sebesseg < min_sebesseg) min_sebesseg = sebesseg;
        }
    }
    cout << "Az első " << vkm << " km-en " << min_sebesseg << " km/h volt a legalacsonyabb megengedett sebesség." << endl;
}

void F4(vector<pair<int, string>> ut, int h)
{
    string jel;
    int varosban = 0, kezd, vege;
    for(auto szakasz: ut)                      // szakasz: <szám, jel> pár
    {
        jel = szakasz.second;
        if(jel.size() > 3)
        {
            kezd = szakasz.first;
        }
        if(jel == "]")
        {
            vege = szakasz.first;
            varosban += (vege-kezd);
        }
    }
    float arany = ((float) varosban / (float) h) * 100;
    cout << setprecision(4) << "Az út " << arany << " százaléka vezet településen belül." << endl;
}

void F5(vector<pair<int, string>> ut, string varos)
{
    string jel;
    int db = 0, varoshossz = 0, kezd, vege;
    bool varosban = false;
    for(auto szakasz: ut)                      // szakasz: <szám, jel> pár
    {
        jel = szakasz.second;
        if(jel == varos)
        {
            kezd = szakasz.first;
            varosban = true;
        }
        if(csakszamok(jel) and varosban) db++;
        if(jel == "]" and varosban)
        {
            vege = szakasz.first;
            break;
        }
    }
    cout << "A sebességkorlátozó táblák száma: " << db << endl;
    cout << "Az út hossza a településen belül " << vege - kezd << " méter." << endl;
}

void F6(vector<pair<int, string>> ut, string varos)
{
    struct info
    {
        string v;               // város neve
        int ke, ve;             // kezdete és vége
    };
    vector<info> varosok;
    string legkozelebb;
    info temp;
    string jel;
    int tav;
    for(auto szakasz: ut)
    {
        jel = szakasz.second;
        tav = szakasz.first;
        if(jel.size() > 3)
        {
            temp.v = jel;
            temp.ke = tav;
        }
        if(jel == "]")
        {
            temp.ve = tav;
            varosok.push_back(temp);
        }
    }
    int index;
    for(int i = 0; i < varosok.size(); i++)
    {
        if(varosok[i].v == varos)
        {
            index = i;
            break;
        }
    }
    if(index == 0)
    {
        // első várost adtuk meg
        legkozelebb = varosok[index + 1].v;
    }
    else if(index == (varosok.size() - 1))
    {
        // utolsó várost adtuk meg
        legkozelebb = varosok[index - 1].v;
    }
    else
    {
        // "belső" várost adtunk meg
        int elozo = (varosok[index].ke - varosok[index - 1].ve);
        int kovetkezo = (varosok[index + 1].ke - varosok[index].ve);
        legkozelebb = (elozo <= kovetkezo) ? varosok[index - 1].v : varosok[index + 1].v;


    }
    cout << "A legközelebbi település: " << legkozelebb << endl;
}

int main()
{
    setlocale(LC_ALL, "");
    vector<pair<int, string>> ut;
    string varos;
    int uthossz = F1(ut);
    cout << "2. feladat" << endl;
    F2(ut);
    cout << "3. feladat" << endl;
    F3(ut);
    cout << "4. feladat" << endl;
    F4(ut, uthossz);
    cout << "5. feladat" << endl;
    cout << "Adja meg egy település nevét! ";
    cin >> varos;
    F5(ut, varos);
    cout << "6. feladat" << endl;
    F6(ut, varos);
    return 0;
}
