#include <iostream>             // cin, cout
#include <fstream>              // fájlkezelés
#include <vector>               // vector adattípushoz
#include <algorithm>            // count, minmax_element, distance

using namespace std;

void F1(vector<int> &g)
{
    cout << "1. feladat" << endl;
    ifstream fbe;
    fbe.open("melyseg.txt");
    int temp;
    while(fbe>>temp)
    {
        g.push_back(temp);
    }
    fbe.close();
    printf("A fájl adatainak száma: %d\n", g.size());
}

void F2(vector<int> &g, int &t)             // t - tav neven "forog" majd a 6. feladathoz is...
{
    cout << endl << "2. feladat" << endl;
    cout << "Adjon meg egy távolságértéket! ";
    cin >> t;
    printf("Ezen a helyen a felszín %d méter mélyen van.\n",g[t-1]);        // indexelés, ugye!
}

void F3(vector<int> g)
{
    cout << endl << "3. feladat" << endl;
    int nulla_db=count(g.begin(), g.end(), 0);              // 0 értékből hány darab van?
    float arany=(float) nulla_db/ (float) g.size()*100;     // float, hogy valós eredményünk legyen
    printf("Az érintetlen terület aránya %.2f%s.\n", arany,"%");        // .2f - két tizedesjegy valós
}

void F4_5(vector<int> g)
{
    cout << endl << "4. feladat" << endl;
    cout << "Adatok kiírása fájlba... ";
    ofstream fki;
    fki.open("godrok.txt");

    bool enter=false;           // ezzel szabályozzuk a soremelést a fájlban a gödrök végén
    int godrok_szama=0;
    for(auto elem:g)
    {
        if(elem>0)              // kezdődik egy gödör
        {
            fki << elem << " "; // kiírjuk
            enter=true;         // "bekapcsoljuk" a soremelés "jelzőt"
        }
        else                    // most felszínen vagyunk
        {
            if(enter)           // ha soremelést kell csinálni, akkor
            {
                godrok_szama++; // gödör volt és számoljuk
                fki << endl;    // fájlban soremelés
            }
            enter=false;        // kapcsolót visszaállítjuk...
        }
    }
    fki.close();
    cout << "kész!" << endl;
    cout << endl << "5. feladat" << endl;
    printf("A gödrök száma: %d\n", godrok_szama);
}

void F6(vector<int> g, int t)
{
    cout << endl << "6. feladat" << endl;

    int kezd, vege;     // 2. feladatban megadott helyen a lehetséges gödör kezdete és vége
                        // itt nagyon meg kell gondolni, hogy mi index, mi igazi sorszám...!!!
    if(g[t-1]==0)
    {
        cout << "Az adott helyen nincs gödör." << endl;
    }
    else
    {
        kezd=t-1;               // az adott ponttól visszafelé megyünk 0-ig
        while(g[kezd-1]!=0)
        {
            kezd--;
        }
        vege=t;                 // az adott ponttól előre megyünk 0-ig
        while(g[vege]!=0)
        {
            vege++;
        }
        cout << "a)" << endl;

        printf("A gödör kezdete: %d méter, a gödör vége: %d méter.", kezd+1, vege);

        cout << endl << "b)" << endl;
        // MONOTON - NEM SZIGORÚAN MONOTON...
        // minmax_element egy adatpárt jelent: first a minimum, second a maximum értéke
        auto it=minmax_element(g.begin()+kezd,g.begin()+vege-1);
        int max_helye=distance(g.begin()+kezd, it.second);      // max helye a kezd-hez képest
        bool le=true;       // gödör "bal" szélétől lefelé ereszkedünk
        for(int i=kezd;i<kezd+max_helye;i++)
        {
            if(g[i]>g[i+1])     // ha az ereszkedésben törés van, akkor bukta van... :)
            {
                le=false;
                break;
            }
        }
        bool fel=true;      // gödör "mélypontjától" felfelé lépkedünk jobb széle felé...
        for(int i=kezd+max_helye;i<vege;i++)
        {
            if(g[i]<g[i+1])     // ha az emelkedésben törés van, akkor bukta van... :)
            {
                fel=false;
                break;
            }
        }
        if(le && fel)       // ha a le, és a fel is sikeres volt, akkor...
        {
            cout << "Folyamatosan mélyül." << endl;
        }
        else
        {
            cout << "Nem mélyül folyamatosan." << endl;
        }

        cout << "c)" << endl;
        printf("A legnagyobb mélysége %d méter.",g[kezd+max_helye]);

        cout << endl << "d)" << endl;
        int terfogat=0;
        for(int i=kezd;i<vege;i++) terfogat+=g[i]*10;       // térfogat=1*mélység*szélesség (minden méterre)
        printf("A térfogata %d m^3.",terfogat);

        cout << endl << "e)" << endl;
        // lehetne máshogy is...
        int mennyiseg=0;
        for(int i=kezd;i<vege;i++) mennyiseg+=(g[i]-1)*10;  // mélységből 1-et elveszünk
        printf("A vízmennyiség %d m^3.\n",mennyiseg);
    }
}

int main()
{
    setlocale(LC_ALL,"");

    vector<int> godor;
    int tav;                // 2. és 6. feladathoz
    godor.reserve(2000);    // 2000 elemre foglaljuk a memóriát...

    F1(godor);
    F2(godor,tav);          // itt az a bizonyos tav, ami a 6. feladathoz is átadásra kerül
    F3(godor);
    F4_5(godor);
    F6(godor,tav);          // tav...

    return 0;
}
