/**
 * Problema 1
 */

# include <stdio.h>
# include <stdlib.h>

int main()
{
        int a[100], i, nr = 0, n;
        printf("n= ");
        scanf("%d", &n);

        for (i = 0; i < n; i++) {
                printf("a[%d]= ", i);
                scanf("%d", &a[i]);
        }

        for (i = 0; i < n; i++)
                if(a[i] < 5)
                        nr++;

        printf("%.2f%%\n", (float)nr * 100 / n);

        return 0;
}
/**
 * Problema 2
 */

# include <stdio.h>

int main()
{
        int v[100], n, i, np, nn, sp, sn;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                printf("v[%d] = ", i);
                scanf("%d", &v[i]);
        }

        nn = np = 0; // numarul de numere negative / pozitive
        sn = sp = 0; // suma numereol negative / pozitive

        for (i = 0; i < n; i++)
                if (v[i] < 0) {
                        nn++;
                        sn += v[i];
                }
                else if (v[i] > 0) {
                        np++;
                        sp += v[i];
                }

        if (nn == 0)
                printf("Nu exista numere negative in sir\n");
        else
                printf("Media numerelor negative este %.2f\n", (float)sn / nn);

        if (np == 0)
                printf("Nu exista numere pozitive in sir\n");
        else
                printf("Media numerelor pozitive este %.2f\n", (float)sp / np);

        return 0;
}
/**
 * Problema 3
 */

# include <stdio.h>

int main()
{
        int v[100], n, i, ct, desc, cresc;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                printf("v[%d] = ", i);
                scanf("%d", &v[i]);
        }

        ct = 1;        // presupunem initial ca sirul este constant
        desc = 1;      // si ordonat descrescator
        cresc = 1;     // si descrescator
        // La sfarsit cel mult una din variabile va fi 1
        for (i = 0; i < n - 1; i++) {
                if (v[i] >= v[i + 1]) // nu e crescator
                        cresc = 0;
                if (v[i] <= v[i + 1]) // nu e descrescator
                        desc = 0;
                if (v[i] != v[i + 1]) // nu e constant
                        ct = 0;
        }

        if (ct)
                printf("Sir constant\n");
        else if (desc)
                printf("Sir descrescator\n");
        else if (cresc)
                printf("Sir crescator\n");
        else
                printf("Sir oarecare\n");

        return 0;
}
/**
 * Problema 4
 */

# include <stdio.h>
# include <limits.h>

int main()
{
        int a[100][100], n, m, i, j, max, min;

        printf("m = ");
        scanf("%d", &m);
        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < m; i++)
                for (j = 0; j < n; j++) {
                        printf("a[%d][%d] = ", i, j);
                        scanf("%d", &a[i][j]);
                }

        min = INT_MAX;
        for (i = 0; i < m; i++) {
                max = a[i][0];  // initializam maximul cu prima valoare
                // de pe linie
                for (j = 1; j < n; j++)
                        if (a[i][j] > max)
                                max = a[i][j];

                if (min > max)
                        min = max;
        }

        printf("Punct in sa = %d\n", min);

        return 0;
}
/**
 * Problema 5
 */

# include <stdio.h>

int main()
{
        int n, m, p, q, A[100][100], B[100][100], i, j, k;
        int C[100][100] = {0}; // toate valorile initializate la 0

        printf("m = ");
        scanf("%d", &m);
        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < m; i++)
                for (j = 0; j < n; j++)
                        scanf("%d", &A[i][j]);

        printf("p = ");
        scanf("%d", &p);
        printf("q = ");
        scanf("%d", &q);
        for (i = 0; i < p; i++)
                for (j = 0; j < q; j++)
                        scanf("%d", &B[i][j]);

        if (n != p) {
                printf("Nu se poate efectua A * B"); // afisam mesaj
                return 0; // iesim din program
        }

        for (i = 0; i < m; i++)
                for (j = 0; j < q; j++)
                        for (k = 0; k < n; k++)
                                C[i][j] += A[i][k] * B[k][j];

        for (i = 0; i < m; i++) {
                for (j = 0; j < q; j++)
                        printf("%d ", C[i][j]);
                printf("\n");
        }

        return 0;
}
/**
 * Problema 6
 */

# include <stdio.h>

int main()
{
        int n, m, i, j, A[100], C[100] = {0};
        float X[100];

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                printf("X[%d] = ", i);
                scanf("%f", &X[i]); // citim cele n numere reale
        }

        printf("m = ");
        scanf("%d", &m);
        for (i = 0; i < m + 1; i++) { // m + 1 numere intregi
                printf("A[%d] = ", i);
                scanf("%d", &A[i]);
        }

        for (i = 0; i < m; i++)
                if (A[i] >= A[i + 1]) {
                        printf("Intervalele nu sunt crescatoare!\n");
                        return 0;
                }

        // C[i] = numarul de numere in intervalul [A[i], A[i + 1]]
        for (i = 0; i < n; i++)                // pentru fiecare numar determinam intervalul
                for (j = 0; j < m; j++)               // din care face parte
                        if (A[j] <= X[i] && X[i] < A[j + 1]) {
                                C[j]++; // am mai gasit un numar din interval
                                break;      // nu mai are sens sa incercam restul de intervale
                        }

        // Hint: o varianta mult mai eficienta ar sorta mai intai vectorul X
        // si ar distribui mai apoi numerele in intervale

        for (i = 0; i < m; i++)
                printf("%d numere in intervalul [%d, %d]\n", C[i], A[i], A[i + 1]);

        return 0;
}
/**
 * Problema 7
 */

# include <stdio.h>
# include <math.h>

int main()
{
        int n, i;
        float C[100], x, p1, p2;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i <= n; i++) { // C[0] ... C[n] => n + 1 coeficienti
                printf("C[%d] = ", i);
                scanf("%f", &C[i]);
        }
        printf("x = ");
        scanf("%f", &x);

        // Suma de termeni calculati cu functia pow
        p1 = 0;
        for (i = 0; i <= n; i++)
                p1 += C[i] * pow(x, n - i);

        // Prin relatia de recurenta P[k] = P[k - 1] * x + C[k]
        p2 = 0;
        for (i = 0; i <= n; i++)
                p2 = p2 * x + C[i];

        printf("p1 = %.2f\n", p1);
        printf("p2 = %.2f\n", p2);

        return 0;
}
/**
 * Problema 8
 */

# include <stdio.h>

int main()
{
        int n, m, i, j, k, A[100], B[100], C[100];

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                printf("A[%d] = ", i);
                scanf("%d", &A[i]);
        }
        printf("m = ");
        scanf("%d", &m);
        for (i = 0; i < m; i++) {
                printf("B[%d] = ", i);
                scanf("%d", &B[i]);
        }

        k = 0; // incepem sa construim noul vector
        i = 0;
        j = 0;
        while (i < n && j < m)
                if (A[i] < B[j]) { // daca elementul curent din A este mai mic
                        C[k] = A[i];
                        i++; // avansam in A
                        k++;
                }
                else {
                        C[k] = B[j];
                        j++; // avansam in B
                        k++;
                }
        // la sfarsit adaugam elementele ramase in A sau in B
        // tot timpul se va intra in cel mult unul din blocurile while
        while (i < n) {
                C[k] = A[i];
                i++;
                k++;
        }
        while (j < m) {
                C[k] = B[j];
                j++;
                k++;
        }

        for (i = 0; i < n + m; i++)
                printf("%d ", C[i]);
        printf("\n");

        return 0;
}
/**
 * Problema 9
 */

# include <stdio.h>

int main()
{
        int n, A[100][100], B[100][100], i, j;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                        scanf("%d", &A[i][j]);

        for (j = 1; j < n; j++){
                for (i = n - j; i < n; i++)
                        printf("%d ", A[i][j]);
                printf("\n");
        }

        printf("\n");

        return 0;
}
/**
 * Problema 10
 */

# include <stdio.h>

int main()
{
        int V[100], n, i, max, maxstart, start;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                printf("V[%d] = ", i);
                scanf("%d", &V[i]);
        }

        max = 0; maxstart = -1;
        start = 0; // pozitia de start
        for (i = 1; i < n; i++)
                if (V[i - 1] > V[i]) {        // daca secventa nu mai e crescatoare
                        if (i - start > max) {       // verificam daca avem un nou maxim
                                max = i - start;
                                maxstart = start;
                        }
                        start = i;
                }

        for (i = maxstart; i < maxstart + max; i++)
                printf("%d ", V[i]);
        printf("\n");

        return 0;
}