#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX_TERM 20
#define MAX 20

typedef struct
{
int col;
int row;
int value;
} term;

int** SM;

void fastTranspose(term *A, term *B)
{
int rowTerms[100] = { 0, };
int startingPos[100] = { 0, };
int i, j, numRows = A[0].col, numTerms = A[0].value;
B[0].col = numRows;
B[0].row = A[0].col;
B[0].value = numTerms;

if (numTerms > 0)
{
for (i = 0; i < numRows; i++)
rowTerms[i] = 0;
for (i = 1; i <= numTerms; i++)
rowTerms[A[i].row]++;

startingPos[0] = 1;

for (i = 1; i < numRows; i++)
startingPos[i] = startingPos[i - 1] + rowTerms[i - 1];

for (i = 1; i <= numTerms; i++)
{
j = startingPos[A[i].row]++;
B[j].col = A[i].row;
B[j].row = A[i].col;
B[j].value = A[i].value;
}
}
}
int** make2dArray(int rows, int cols)
{
int** x;

x = (int**)malloc(sizeof(int*) * rows);

for (int i = 0; i < rows; i++)
x[i] = (int*)malloc(sizeof(int) * cols);

for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
x[i][j] = 0;

return x;
}
void generateTerm(term a[], int rows, int cols, int value)
{
a[0].row = rows;
a[0].col = cols;
a[0].value = value;
int temp = 1;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
if (SM[i][j] != 0)
{
a[temp].col = i;
a[temp].row = j;
a[temp].value = SM[i][j];
temp++;
}
}
}
void printTerm(term a[], int rows, int cols)
{
int l = 1;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
if (a[l].col == i && a[l].row == j)
printf("%5d", a[l++].value);
else
printf("%5d", 0);
}
printf("\n");
}
printf("\n");
}



int main()
{
FILE* fp;
fp= fopen("a.txt", "r");
FILE* fp2;
fp2 = fopen("b.txt", "w");

int rows, cols, value;
fscanf(fp, "%d %d %d\n", &rows, &cols, &value);

term* a = (term*)malloc(sizeof(term) * value);
term* b = (term*)malloc(sizeof(term) * value);

SM = make2dArray(rows, cols);
for (int i = 0; i < value; i++)
{
int j, k, z;
fscanf(fp, "%d %d %d\n", &j, &k, &z);
SM[j][k] = z;
}

generateTerm(a, rows, cols, value);

printf("A\n");
printTerm(a, rows, cols);

fastTranspose(a, b);

printf("B\n");
printTerm(b, rows, cols);

for (int i = 0; i <= value; i++)
fprintf(fp2, "%3d\t%3d\t%3d\n", b[i].col, b[i].row, b[i].value);

fclose(fp);
fclose(fp2);

return 0;
}