#include<stdio.h>
#include<stdlib.h>
int **  alociraj(int m,int n);

void brisi(int **mat,int m);
void ucitaj(int ** mat, int bvrsta, int bkolona);

int ** mnozi(int **mat1, int **mat2, int bvrsta1,int bkolona1,int bvrsta2,int bkolona2);
 
 void ispisi(int **mat,int bvrsta, int bkolona);
 main()
 {
 int bkolona1, bvrsta1, bkolona2, bvrsta2;
 int **mat1;
 int **mat2;
 int **mat;
 scanf("%d %d %d %d",&bvrsta1, &bkolona1, &bvrsta2, &bkolona2);
 mat1=alociraj(bvrsta1,bkolona1);
 mat2=alociraj(bvrsta2,bkolona2);
 ucitaj(mat1,bvrsta1,bkolona1);
 ucitaj(mat2,bvrsta2,bkolona2);
 mat=mnozi(mat1,mat2,bvrsta1,bkolona1,bvrsta2,bkolona2);
 ispisi(mat1,bvrsta1,bkolona2);
 brisi(mat1,bvrsta1);
 brisi(mat2,bvrsta2);
 brisi(mat,bvrsta2);
 }
 int **  alociraj(int m,int n)
{
int ** mat;
int i;
mat=malloc(m*sizeof(int*));
if(mat==NULL){
printf("greska u memoriji");
exit(1);}
for(i=0;i<=m;i++){
mat[i]=malloc(n*sizeof(int));
if (mat[i]==NULL){
printf("greska u memoriji");
exit(i);
}}
return m;}
void brisi(int **mat,int m){
int i;
for(i=0;i<=m;i++)
free(mat[i]);
free(mat);}
void ucitaj(int ** mat, int bvrsta,int bkolona){
int i,j;
for (i=0;i<=bvrsta;i++)
for (j=0;j<=bkolona;j++)
scanf("%d",&mat[i][j]);}
/*funkcija koja vraca rezultat mnozenja dve matrice*/
int ** mnozi(int **mat1, int **mat2, int bvrsta1,int bkolona1,int bvrsta2,int bkolona2){
int i,j,k,s,a;
int **mat;
mat=alociraj(bvrsta1,bkolona2);
for(a=0;a<=bvrsta1;a++)
for(s=0;s<=bkolona2;s++)
mat[a][s=0];

for(i=0;i<=bvrsta1;i++)
      for(j=0;bkolona2;j++)
         for(k=0;k<=bkolona1;k++)
         mat[i][j]=mat[i][j]+mat1[i][k]*mat2[k][j];
         
         return mat;}
 /* ispisivanje matrice*/
 void ispisi(int **mat,int bvrsta, int bkolona){
 int i,j;
 for(i=0;i<=bvrsta;i++)
 {for(j=0;j<=bkolona;j++)
 printf("%d",mat[i][j]);
 printf("\n");}}    