#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

struct numbers
{
    int n1;
    int n2;
    int max;
};

typedef struct numbers numbers;

void *max(void *n)
{
    numbers *comp = (numbers *)n;
    if (comp->n1 > comp->n2)
        comp->max = comp->n1;
    else
        comp->max = comp->n2;
}

int main(int argc, char **argv)
{
    if (argc != 9)
    {
        printf("Usage : %s <n1> <n2> <n3> <n4> <n5> <n6> <n7> <n8>\n", argv[0]);
        return EXIT_FAILURE;
    }

    pthread_t threads[4];
    numbers duels[4];

    for (int i = 0; i < 4; i++)
    {
        duels[i].n1 = (int)strtod(argv[2 * i + 1], NULL);
        duels[i].n2 = (int)strtod(argv[2 * (i + 1)], NULL);
        duels[i].max = 0;
        pthread_create(&threads[i], NULL, max, (void *)(duels + i));
    }

    for (int i = 0; i < 4; i++)
    {
        pthread_join(threads[i], NULL);
    }

    numbers demi_f[2];

    for (int i = 0; i < 2; i++)
    {
        demi_f[i].n1 = duels[i * 2].max;
        demi_f[i].n2 = duels[i * 2 + 1].max;
        demi_f[i].max = 0;
        pthread_create(&threads[i], NULL, max, (void *)(demi_f + i));
    }

    for (int i = 0; i < 2; i++)
    {
        pthread_join(threads[i], NULL);
    }

    numbers finale = {};
    finale.n1 = demi_f[0].max;
    finale.n2 = demi_f[1].max;

    pthread_create(&threads[0], NULL, max, (void *)(&finale));
    pthread_join(threads[0], NULL);

    printf("Le plus grand des huits nombres est : %d\n", finale.max);

    return EXIT_SUCCESS;
}