// https://odorpeter.hu/

#include <iostream>     // cin cout
#include <iomanip>      // setw()
#include <map>          // "szótár" (map) adattípushoz
#include <set>          // halmaz adattípushoz
#include <vector>       // vektor (vector) adattípushoz
#include <fstream>      // szöveges fájlok kezelése
#include <algorithm>    // count

using namespace std;

struct park             // felajanlas.txt tartalmának megfelelő struktúra
{
    int kezd,vege;
    char szin;
};
struct f6               // 6. feladathoz kell ez a struktúra
{
    char sz;            // virágágyás színe
    int ssz;            // felajánlás sorszáma
};

void F1(int &n, vector<park> &f)
{
    ifstream fbe;
    fbe.open("felajanlas.txt");
    fbe>>n;
    park temp;
    while(fbe>>temp.kezd and fbe>>temp.vege and fbe>>temp.szin)
    {
        f.push_back(temp);
    }
    fbe.close();
}

void F2(vector<park> f)
{
    cout << "2. feladat" << endl;
    cout << "A felajánlások száma: " << f.size() << endl;
}

void F3(vector<park> f)
{
    cout << "3. feladat" << endl;
    cout << "A bejárat mindkét oldalán ültetők: ";
    for (int i=0; i<f.size(); i++)
    {
        if(f[i].kezd>f[i].vege)         // ha a felajanlasban a kezdo szam nagyobb, mint a vege:
            cout << i+1 << " ";
    }
    cout << endl;
}

void F4(int n,vector<park> f)
{
    set<char> szinek;
    char elso;
    int as, eltol, db=0;

    cout << "4. feladat" << endl;
    cout << "Adja meg az ágyás sorszámát! ";
    cin >> as;
    for(auto elem:f)
    {
        elem.kezd<elem.vege ? eltol=0 : eltol=n;
        if(elem.kezd<=as+eltol && as+eltol<=elem.vege+eltol)
        {
            db++;
            if(szinek.size()==0) elso=elem.szin;
            szinek.insert(elem.szin);
        }
    }
    printf("A felajánlók száma: %i\n", db);
    if(db>0)
    {
        printf("A virágágyás színe, ha csak az első ültet: %c\n", elso);
        cout << "A virágágyás színei: ";
        for(auto elem:szinek)
        {
            cout << elem << " ";
        }
    }
    else
    {
        cout << "Ezt az ágyást nem ültetik be." << endl;
    }
    cout << endl;
}

void F5(int n, vector<park> f)
{
    cout << "5. feladat" << endl;
    vector<bool> agyasok(n, false);
    int k, v, agyas_db=0;
    for(auto elem:f)
    {
        k=elem.kezd;
        v=elem.vege;
        if(k<v)
        {
            agyas_db+=v-k+1;
            for(int i=k-1;i<v;i++) agyasok[i]=true;
        }
        else
        {
            agyas_db+=n-k+1+v;
            for(int i=k-1;i<n;i++) agyasok[i]=true;
            for(int i=0;i<v;i++) agyasok[i]=true;
        }
    }
    int true_db=count(agyasok.begin(),agyasok.end(),true);
    if(true_db==n) cout << "Minden ágyás beültetésére van jelentkező." << endl;
    else if(agyas_db>=n) cout << "Átszervezéssel megoldható a beültetés." << endl;
    else cout << "A beültetés nem oldható meg." << endl;
}

void F6(int n, vector<park> f)
{

    cout << "6. feladat" << endl;

    vector<f6> agyasok(n);
    for(int i=0;i<n;i++)
    {
        agyasok[i].sz='#'; agyasok[i].ssz=0;
    }
    int k, v, sorszam=0;
    for(auto elem:f)
    {
        sorszam++;
        k=elem.kezd;
        v=elem.vege;
        if(k<v)
        {
            for(int i=k-1;i<v;i++)
            {
                if(agyasok[i].sz=='#')
                {
                    agyasok[i].sz=elem.szin;
                    agyasok[i].ssz=sorszam;
                }
            }
        }
        else
        {
            for(int i=k-1;i<n;i++)
            {
                if(agyasok[i].sz=='#')
                {
                    agyasok[i].sz=elem.szin;
                    agyasok[i].ssz=sorszam;
                }
            }
            for(int i=0;i<v;i++)
            {
                if(agyasok[i].sz=='#')
                {
                    agyasok[i].sz=elem.szin;
                    agyasok[i].ssz=sorszam;
                }
            }
        }
    }

    ofstream fki;
    fki.open("szinek.txt");
    for(auto agyas:agyasok)
    {
        fki << agyas.sz << " " << agyas.ssz << endl;
    }
    fki.close();
}

int main()
{
    setlocale(LC_ALL,"");
    //adatok
    vector<park> felajanlas;
    int N;
    F1(N,felajanlas);
    F2(felajanlas);
    F3(felajanlas);
    F4(N,felajanlas);
    F5(N,felajanlas);
    F6(N,felajanlas);
}
