#include <iostream>

using namespace std;

typedef struct elem{
	int pid;
	int ing;
	int nig;
	int dur;
	int esp;
	int pwt;
	int end;
	elem * next;
}tipoProc;

typedef struct l{
	tipoProc * ini;
	tipoProc * end;	
}tipoList;

int QUANTUM;
int pid;
tipoList * lc = (tipoList *) malloc(sizeof(tipoList));
int GLOBAL_TIME = 0;
float MEXEC = 0.0;
float MESPE = 0.0;


void print_list()
{
	tipoProc * l = lc->ini;
	int flag = 1;

	if(l == NULL)
	{
		printf("NULL\n");
		return;
	}

	while(l and flag)
	{
		if(l == lc->end) flag = 0;
		printf("PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end);
		l = l->next;
	}
	printf("\n");
}


void round_robin()
{
	// printf("ini\n");
	// print_list();
	// printf("fim\n");
	tipoProc * l = lc->ini;
	GLOBAL_TIME = l->ing; /* tempo começa no instante que o primeiro cara chega */

	// for(int j = 0; j < 15; j++)
	while(l)
	{
		// printf("dentro ini\n");
		// print_list();
		// printf("dentro fim\n");
		// printf("instancia %d\n", j);
		if(l->dur < QUANTUM) /* processa finaliza menor que quantum */
		{
			// printf("< PID: %d, ing:%d, dur:%d\n", l->pid, l->ing, l->dur);
			// printf("P%d DURACAO %d < QUANTUM\n", l->pid, l->dur);

			if(l->nig > GLOBAL_TIME)
			{
				GLOBAL_TIME = l->nig + l->dur + QUANTUM;
			}
			else
			{
				GLOBAL_TIME += l->dur;
			}

			l->dur = 0;
			l->end = GLOBAL_TIME; /* tempo em que o processo finaliza */
			printf("P%d ", l->pid);
			MEXEC += l->end + l->ing;
			// printf("GLOBAL_TIME===%d\n", GLOBAL_TIME);
			// printf("ESSA LISTA\n");
			// print_list();
			// printf("FIM DA LISTA\n");
			// print_list();
			// l deve ser adiciona na lista de finalizados BEM AQUI

			// printf("***** antes -- DEMON ****\n");
			// print_list();
			// printf("----\n");

			// printf("CORRENTE -- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end);

			l = lc->ini->next;
			lc->ini = l;

			// printf("nova lista\n");
			// print_list();

			if(lc->ini == lc->end)
			{
				//
				if(l->nig > GLOBAL_TIME)
				{
					GLOBAL_TIME = l->nig + l->dur + QUANTUM;
				}
				else
				{
					GLOBAL_TIME += l->dur;
				}

				l->dur = 0;
				l->end = GLOBAL_TIME; /* tempo em que o processo finaliza */
				printf("P%d ", l->pid);
				// MEXEC += l->end + l->ing;
				break;
			}

			// printf("***** DEMON ****\n");
			// print_list();
			// printf("----\n");
			// remove l da lista -- colocar na lista de finalizados
			// atualiza lc
			// l = lc
			// printf("entrou no 1 if\n");
			continue;
		}
		else if(l->dur == QUANTUM) /* processa finaliza igual quantum */
		{
			// printf("== PID: %d, ing:%d, dur:%d\n", l->pid, l->ing, l->dur);
			// printf("P%d DURACAO %d == QUANTUM\n", l->pid, l->dur);
			l->dur -= QUANTUM;

			/* checa se o processo finalizou */
			if(l->dur == 0) 
			{
				if(l->nig > GLOBAL_TIME)
				{
					GLOBAL_TIME = l->nig + l->dur + QUANTUM; // tirei o quantum coloca de novo
				}
				else
				{
					GLOBAL_TIME += QUANTUM;	
				}
				
				l->end = GLOBAL_TIME; /* tempo em que o processo finaliza */
				printf("P%d ", l->pid);
				MEXEC += l->end + l->ing;
				// printf("GLOBAL_TIME===%d\n", GLOBAL_TIME);
				// printf("ESSA LISTA\n");
				// print_list();
				// printf("FIM DA LISTA\n");
				// l deve ser adiciona na lista de finalizados BEM AQUI

				// if(lc->ini == lc->end)
				// {
				// 	l = NULL;
				// 	break;
				// }

				// printf("CORRENTE -- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end);


				l = lc->ini->next;
				lc->ini = l;

				// printf("nova lista\n");
				// print_list();
				// printf("----\n");
				// print_list();
				// printf("----\n");

				// printf("entrou no 2 if\n");

				continue;
			}
		}
		else /* processo volta pra lista */
		{
			printf("P%d ", l->pid);

			if(l->nig > GLOBAL_TIME)
			{
				GLOBAL_TIME = l->nig + QUANTUM;
			}
			else
			{
				GLOBAL_TIME += QUANTUM;
			}

			// printf("--- GLOBAL_TIME==%d\n", GLOBAL_TIME);
			// printf("PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end);

			l->nig += QUANTUM;
			l->dur -= QUANTUM;

			
			// printf("PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end);
			// printf("GLOBAL_TIME===%d\n", GLOBAL_TIME);

			// readiciona processo na lista
			tipoProc * caminha = lc->ini;
			tipoProc * ante = lc->end;
			int flag = 1;

			// printf("PERDIDA\n");
			// print_list(); // taok ate aqui
			// printf("PERDIDA\n");

			//remove cara da lista
			while(caminha and flag)
			{
				if(caminha == lc->end) flag = 0;	

				if(caminha == l)
				{
					if(caminha == lc->ini)
					{
						// printf("1\n");
						if(caminha == lc->end)
						{
							lc->ini = NULL;
							lc->end = NULL;
							// printf("broderoooooo\n");
							// printf("CARA --- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end);
							break;
						}

						// l continua apontando para o mesmo lugar
						lc->ini = caminha->next;
						lc->end->next = lc->ini;
						// print_list();
						break;
					} 
					else if(caminha == lc->end)
					{
						// printf("2\n");
						// ta no fim
						ante->next = lc->ini;
						lc->end = ante;
						break;
					}
					else
					{
						// printf("3\n");
						// ta no meio
						ante->next = caminha->next;
						break;
					}
				}
				ante = caminha;
				caminha = caminha->next;
			}
			//remove cara da lista	
			
			caminha = lc->ini;		
			ante = lc->end;
			flag = 1;

			// printf("CHEGAR AQUIIIIII\n");
			// print_list();
			// printf("CARA --- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end);
			// printf("lc-ini-pid=%d\n", lc->ini->pid);
			// printf("lc-end-pid=%d\n", lc->end->pid);

			if(lc->ini == NULL and lc->end == NULL)
			{
				lc->ini = l;
				lc->end = l;
				lc->end->next = l;

				continue;
			}

			// add cara na lista
			while(caminha and flag)
			{
				if(caminha == lc->end) flag = 0;	

				if(l->nig < caminha->nig)
				{
					// vai antes
					if(caminha == lc->ini) // e o primeiro elemento
					{
						// printf("A\n");
						// print_list();

						// printf("caminha->pid=%d\n", caminha->pid);
						// printf("lc->ini->pid=%d\n", lc->ini->pid);
						// printf("lc->end->pid=%d\n", lc->end->pid);
						// printf("l->pid%d\n", l->pid);

						l->next = caminha;
						lc->ini = l;
						lc->end->next = l;

						l = lc->ini; // continuar no while
						// printf("**************** \n");
						// print_list();
						// printf("**************** \n");
						break;
					}
					else // ta no meio da lista
					{
						// printf("B\n");
						ante->next = l;
						l->next = caminha;
						l = lc->ini; // continuar no while
						break;
					}
				}
				else if(caminha == lc->end) // e igual ou maior, vai depois
				{
					// printf("C\n");
					// vai depois
				 	// e o ultimo elemento
					// ta no final
					caminha->next = l;
					l->next = lc->ini;
					lc->end = l;
					l = lc->ini; // continuar no while
					break;
				}
				ante = caminha;
				caminha = caminha->next;
			}

		}
		// printf("a lista\n");
		// print_list();
	}
}

void add_elem_lis(int ing, int dur)
{
	tipoProc * elem = (tipoProc *) malloc(sizeof(tipoProc));
	elem->pid = pid++;
	elem->ing = ing;
	elem->dur = dur;
	elem->esp = 0;
	elem->nig = ing;
	elem->end = -1;

	if(lc->ini == NULL) /* list esta vazia */
	{
		lc->ini = elem;
		lc->end = elem;
		elem->next = elem;
	}
	else
	{
		lc->end->next = elem;
		lc->end = elem;
		elem->next = lc->ini; 
	}
}


void create_list()
{
	lc->ini = NULL;
	lc->end = NULL;
}

void free_list() 
{
	tipoProc * l = lc->ini;
	tipoProc * aux;
	int flag = 1;

	while(l and flag)
	{
		if(l == lc->end) flag = 0;
		aux = l;
		l = l->next;
		free(l);
	}
	
	lc->ini = NULL;
	lc->end = NULL;
}


int main(int argc, char const *argv[])
{
	int m, n, ing, dur, ts = 1;
	create_list(); /* cria lc -- lista circular que contem processsos */

	cin >> m;
	QUANTUM = m;
	pid = 1;

	while(cin >> n and n) 
	{
		printf("\nTeste %d\n", ts);

		for(int i=0; i<n; i++)
		{
			cin >> ing >> dur;
			add_elem_lis(ing, dur);
		}
		// print_list();
		round_robin();
		printf("\nTempo medio de execucao: %.2f\n", (MEXEC/(pid-1)));
		printf("Tempo medio de espera: %.2f\n", MESPE);
		free_list();
		pid = 1;
		ts++;
	}

	return 0;
}