/* 
 * Problema 18.  Ordenação por colunas.
 * 
 * - Escreva uma função de protótipo
 * 
 *   void ordene_por_col(int A[][NMAX], int M, int N, int c);
 * 
 *   que recebe como parâmetros dois inteiros positivos M e N, uma matriz
 *   de inteiros A_{M x N}, o índice c de uma coluna, e ordena as linhas de
 *   A segundo a coluna c.  
 * 
 * - Dadas 0 < M <= MMAX datas em uma matriz D_{M x 3}, onde a primeira
 *   coluna corresponde ao dia, a segunda ao mês e a terceira ao ano,
 *   colocar essas datas em ordem cronológica crescente, usando a função
 *   acima. 
 */ 

#include <stdio.h>

#define MMAX 100
#define NMAX 100

void ordene_por_col(int A[][NMAX], int M, int N, int c);
void exch(int A[][NMAX], int N, int i, int j);
void ordene_datas(int D[][3], int M);
int leia_datas(int D[][3]);
void imprima_datas(int D[][3], int M);
  
int main()
{
  int D[MMAX][3];
  int M = leia_datas(D);

  ordene_datas(D, M);
  imprima_datas(D, M);
  
  return 0;
}

void ordene_por_col(int A[][NMAX], int M, int N, int c)
{
  int i, j;
  for (i = 1; i < M; i++)
    for (j = i; j > 0 && A[j][c] < A[j - 1][c]; j--) 
      exch(A, N, j - 1, j);
}

void exch(int A[][NMAX], int N, int i, int j)
{
  int k;
  for (k = 0; k < N; k++) {
    int t = A[i][k];
    A[i][k] = A[j][k];
    A[j][k] = t;
  }
}

void ordene_datas(int D[][3], int M)
{
  int i, j;
  int A[MMAX][NMAX];

  for (i = 0; i < M; i++) 
    for (j = 0; j < 3; j++) 
      A[i][j] = D[i][j];
  
  ordene_por_col(A, M, 3, 0);
  ordene_por_col(A, M, 3, 1);
  ordene_por_col(A, M, 3, 2);

  for (i = 0; i < M; i++) 
    for (j = 0; j < 3; j++) 
      D[i][j] = A[i][j];
}

void imprima_datas(int D[][3], int M)
{
  int i;

  for (i = 0; i < M; i++) 
    printf("%2d %2d %4d\n", D[i][0], D[i][1], D[i][2]);
}

int leia_datas(int D[][3])
{
  int i = 0;

  while (i < MMAX && scanf("%d %d %d", &D[i][0], &D[i][1], &D[i][2]) == 3) 
    i++;

  return i;
}
