using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {

        // 1. UZDEVUMS – MENESA BUDEZTS
      

        // Virsraksts konsoles loga
        Console.WriteLine("Menesa budzeta analize");

        // Lietotajs ievada visus izdevumus
        List<double> izdevumi = IevadietIzdevumus();

        // Minimalais slieksnis, zem kura izdevumi netiek skaititi
        Console.Write("Ievadiet minimalo izdevumu slieksni: ");
        double slieksnis = double.Parse(Console.ReadLine());

        // Filtre izdevumus pec slieksna
        List<double> filtreti = FiltretIzdevumus(izdevumi, slieksnis);

        // Ja ir vismaz viens derigs izdevums
        if (filtreti.Count > 0)
        {
            // Aprrekina starpibu starp lielako un mazako izdevumu
            double diapazons = AprekinatMainibu(filtreti);
            Console.WriteLine($"Izdevumu diapazons: {diapazons:F2}");
        }
        else
        {
            Console.WriteLine("Nav izdevumu virs slieksna.");
        }

       
        // 2. UZDEVUMS – NOLIKTAVA
   

        Console.WriteLine("\n=== Noliktavas mekleetajs ===");

        // Divdimensiju masivs: ejas un plaukti
        string[,] noliktava =
        {
            { "A12", "B34", "", "C56", "D78" },
            { "E90", "", "F12", "G34", "" },
            { "H56", "I78", "J90", "", "K12" },
            { "", "L34", "M56", "N78", "O90" }
        };

        // Preces koda ievade
        Console.Write("Ievadiet mekleejamo preces kodu: ");
        string kods = Console.ReadLine();

        // Mekle preci noliktava
        Console.WriteLine(AtklatPreci(noliktava, kods));

        // Saskaita, cik plaukti ir tuksi
        int tuksi = AprekinatNeaizpilditas(noliktava);
        Console.WriteLine($"Tukso plauktu skaits: {tuksi}");

     
        // 3. UZDEVUMS – MATEMATIKA
    
        Console.WriteLine("\n=== Attaluma kalkulators ===");

        // Pirma punkta koordinatas
        Console.Write("x1: ");
        double x1 = double.Parse(Console.ReadLine());
        Console.Write("y1: ");
        double y1 = double.Parse(Console.ReadLine());

        // Otra punkta koordinatas
        Console.Write("x2: ");
        double x2 = double.Parse(Console.ReadLine());
        Console.Write("y2: ");
        double y2 = double.Parse(Console.ReadLine());

        // Aprrekina attalumu starp diviem punktiem
        double attalums = AprekinatPlaknesAttalumu(x1, y1, x2, y2);
        Console.WriteLine($"Attalums starp punktiem: {attalums:F2}");

        // Lenka konvertesana no gradiem uz radianiem
        Console.Write("Ievadiet lenki grados: ");
        double gradi = double.Parse(Console.ReadLine());
        double radiani = KonvertetRadianos(gradi);
        Console.WriteLine($"Radianos: {radiani:F4}");
    }


    // 1. UZDEVUMA METODES


    // Ievada izdevumus lidz tuksa rinda vai "gals"
    static List<double> IevadietIzdevumus()
    {
        List<double> izdevumi = new List<double>();
        Console.WriteLine("Ievadiet izdevumus (tuksa rinda vai 'gals' – beigt):");

        while (true)
        {
            string ievade = Console.ReadLine();

            // Partrauc ievadi, ja nav teksta vai ievadits "gals"
            if (string.IsNullOrWhiteSpace(ievade) || ievade.ToLower() == "gals")
                break;

            // Ja ievade ir skaitlis, pievieno sarakstam
            if (double.TryParse(ievade, out double summa))
                izdevumi.Add(summa);
        }

        return izdevumi;
    }

    // Atstaj tikai tos izdevumus, kas ir lielaki vai vienadi ar slieksni
    static List<double> FiltretIzdevumus(List<double> izejasDati, double slieksnis)
    {
        List<double> filtreti = new List<double>();

        foreach (double izdevums in izejasDati)
        {
            // Ja izdevums ir par mazu, izlaiž iteraciju
            if (izdevums < slieksnis)
                continue;

            filtreti.Add(izdevums);
        }

        return filtreti;
    }

    // Aprrekina diapazonu: max - min
    static double AprekinatMainibu(List<double> dati)
    {
        double min = dati[0];
        double max = dati[0];

        foreach (double d in dati)
        {
            if (d < min) min = d;
            if (d > max) max = d;
        }

        // Absoluta vertiba, lai rezultats butu pozitivs
        return Math.Abs(max - min);
    }


    // 2. UZDEVUMA METODES


    // Mekle preci noliktavas masiva
    static string AtklatPreci(string[,] masivs, string kods)
    {
        int ejas = masivs.GetLength(0);
        int plaukti = masivs.GetLength(1);

        bool atrasts = false;
        int atrEja = -1;
        int atrPlaukts = -1;

        // Ligzdoti cikli ejam un plauktiem
        for (int i = 0; i < ejas; i++)
        {
            for (int j = 0; j < plaukti; j++)
            {
                if (masivs[i, j] == kods)
                {
                    atrasts = true;
                    atrEja = i + 1;      // +1, lai sakas no 1
                    atrPlaukts = j + 1;
                    break;              // Partrauc ieksejo ciklu
                }
            }

            if (atrasts)
                break;                  // Partrauc arejo ciklu
        }

        if (atrasts)
            return $"Prece atrasta Eja {atrEja}, Plaukts {atrPlaukts}";
        else
            return "Prece nav atrasta noliktava.";
    }

    // Saskaita tukšos plauktus
    static int AprekinatNeaizpilditas(string[,] masivs)
    {
        int skaits = 0;

        foreach (string prece in masivs)
        {
            // Tuksa virkne vai null nozime, ka plaukts ir tukss
            if (string.IsNullOrEmpty(prece))
                skaits++;
        }

        return skaits;
    }


    // 3. UZDEVUMA METODES


    // Aprrekina attalumu starp diviem punktiem plakne
    static double AprekinatPlaknesAttalumu(double x1, double y1, double x2, double y2)
    {
        double dx = Math.Pow(x2 - x1, 2); // (x2 - x1)^2
        double dy = Math.Pow(y2 - y1, 2); // (y2 - y1)^2
        return Math.Sqrt(dx + dy);        // Kvadratsakne
    }

    // Konverte gradius uz radianiem
    static double KonvertetRadianos(double gradi)
    {
        return gradi * Math.PI / 180.0;
    }
}
