Ciao, non ho capito come gestisci l'input, dove salvi i dati. Comunque io ti faccio vedere un codice che ho fatto adesso:
**********************************************
#include <stdio.h>
#include <string.h>
#include <windows.h>
/* questa è una strttura dove saranno salvati i dati del candidato dall'input dell'utente */
struct Candidato
{
	int tempo; //conterrà il tempo
	char nome[120]; //conterrà il nome del candidato
};
int GetVincitore(struct Candidato*, int nblocco);
int main()
{
	struct Candidato cnd[9]; //creo un vettori di Candidato ci saranno 9 candidati per 3 gare quindi.
	char ris[2]={'Y'}; //serve per sapere se aggiungere candidati per una gara
	char buffer[100]; //conterrà le stringhe per l'output
	int r=0;
	int i=0;//conta il numero di candidati ed è l'indice del vettore cnd
	int y=0; //conta i candidati per gara
	int cmpt=0;//conterrà il numero di manche
          /* l'output del programma */
	while ((strcmp(ris,"Y")==0) || (strcmp(ris,"y")==0))
	{
		while (y<3) //dopo 3 candidati fine della manche
		{
			printf("%s\n","Inserisci il nome del candidato:");
			scanf("%s",cnd.nome); //salva il nome del candidato nel vettore iesimo della struttura cnd
			printf("%s\n","Inserisci il tempo:");
			scanf("%d",&cnd.tempo); //salva il tempo nel vettore iesimo della struttura cnd
			i++;
			y++;
		}
		y=0;
		printf("%s","Inserire un nuovo candidato?[Y/N]");//se inserire nuova manche
		scanf("%s",ris);
	}	
	cmpt = i/3; //numero di competizioni avrei potuto anche inserire una variabile che si incrementasse per ogni volta che inserivamo una nuova manche(competizione)
	sprintf(buffer,"%s%d\n","Le competizioni sono ",cmpt);
	printf("%s\n",buffer);
	for (int cnt=1;cnt<=cmpt;cnt++)//adesso faccio un ciclo e ottengo il vincitore di ogni manche(competizione)
	{
		r = GetVincitore(cnd,cnt);
		sprintf(buffer,"%s%d%s%s\n","Il vincitore del gruppo ",cnt, " e' ",cnd[r-1].nome); //lo stampo su schermo
		printf("%s",buffer);
	}
	system("pause");
	return 1;
}
/* questa funzione estrae il vincitore dalla manche */
int GetVincitore(struct Candidato* cnd,int nblocco)
{
//nblocco è il numero della manche(competizione)
//cnd è il puntatore che punta al primo elemento dell'array creato prima che contiene tutti i dati dei concorrenti
	int i;
	struct Candidato* p;
	/* confronto il primo elemento con il secondo se questo(il primo) è maggiore del secondo verifica se è maggiore anche dell'ultimo e ritorna questo altrimenti verifica il secndo con l'ultimo se il secondo è + piccolo ritorna il secondo altrimenti ritorna il terzo.
Avendo la struttura cosi:
0: gara1 dove 0 è l'indice del vettore della struttura ecc...
1: gara2
2: gara3
----- manche 2
3: gara1
4: gara2
5:  gara3
---ecc..
per sapere dal blocco quali elementi confrontare faccio (nblocco-1)*3. Se ad esempio voglio il vincitore del blocco 1 quindi nblocco=1 viene nblocco-1=0*3=0 quindi indice 0 inizio dall'elemento dell'array con indice 0(l'inizio) se voglio il blocco 2 invece (nblocco=2) nblocco-1=1*3=3 quindi elemento terzo dell'array(inizia il confronto dall'elemento 3. Se voglio il vincitore del blocco 3 nblocco=3 viene nblocco-1=2*3=6 quindi parlo dall'elemento con indice 6 ecc...*/
	for(i=(nblocco-1)*3;i<((nblocco-1)*3)+3;cnd++)
	{
		i++;
		p=cnd;/*faccio puntare p al successivo di cnd*/
		p++;
		for(int j=i;i<((nblocco-1)*3)+3;j++,p++)
		{
			if(cnd->tempo >p->tempo)
				break;
			if (j+1==((nblocco-1)*3)+3) return i;
		}
	
	}
	return i;
}
**********************************************
La funzione + importante è appunto GetVincitore
Non è difficile se vuoi te lo spiego meglio...