#include <stdint.h>
#include <vector>
#include <iostream>
template <typename T>
void MatrixTranspose(T &matr, typename T::size_type r, typename T::size_type c)
{
if ( r <= 1 || c <= 1 )
return;
typedef typename T::size_type size_type;
typedef typename T::value_type value_type;
size_type ind, ind_last;
value_type buff;
ind_last = r * c - 2;
while ( c > 1 )
{
for ( size_type i = r - 2; i != size_type(-1); --i )
{
ind = i * c + (c - 1);
buff = matr.at(ind);
while ( ind < ind_last )
{
matr.at(ind) = matr.at(ind + 1);
++ind;
}
matr.at(ind_last) = buff;
--ind_last;
}
--ind_last;
--c;
}
return;
}
template <typename T>
void MatrixPrint(T &matr, typename T::size_type r, typename T::size_type c)
{
using namespace std;
typedef typename T::size_type size_type;
for ( size_type i = 0u; i != r; ++i )
{
for ( size_type j = 0u; j != c; ++j )
cout << matr.at(i * c + j) << " ";
cout << endl;
}
cout << endl;
return;
}
int main()
{
using namespace std;
typedef vector<int32_t> matr_type;
typedef matr_type::size_type size_type;
typedef matr_type::value_type value_type;
size_type r, c;
value_type buff;
uint_fast32_t numberOfMatrix;
matr_type matr;
cin >> numberOfMatrix;
for ( uint_fast32_t counter = 0; counter != numberOfMatrix; ++counter )
{
r = c = 0;
cin >> r >> c;
for ( size_type ind = 0, end = r * c; ind != end; ++ind )
{
cin >> buff;
matr.push_back(buff);
}
//MatrixPrint(matr, r, c);
MatrixTranspose(matr, r, c);
MatrixPrint(matr, c, r);
matr.clear();
}
return 0;
}
I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+CgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIE1hdHJpeFRyYW5zcG9zZShUICZtYXRyLCB0eXBlbmFtZSBUOjpzaXplX3R5cGUgciwgdHlwZW5hbWUgVDo6c2l6ZV90eXBlIGMpCnsKCWlmICggciA8PSAxIHx8IGMgPD0gMSApCgkJcmV0dXJuOwoJCgl0eXBlZGVmIHR5cGVuYW1lIFQ6OnNpemVfdHlwZSAgc2l6ZV90eXBlOwoJdHlwZWRlZiB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CgkKCXNpemVfdHlwZSAgaW5kLCBpbmRfbGFzdDsKCXZhbHVlX3R5cGUgYnVmZjsKCQoJaW5kX2xhc3QgPSByICogYyAtIDI7Cgl3aGlsZSAoIGMgPiAxICkKCXsKCQlmb3IgKCBzaXplX3R5cGUgaSA9IHIgLSAyOyBpICE9IHNpemVfdHlwZSgtMSk7IC0taSApCgkJewoJCQlpbmQgPSBpICogYyArIChjIC0gMSk7CgkJCWJ1ZmYgPSBtYXRyLmF0KGluZCk7CgkJCXdoaWxlICggaW5kIDwgaW5kX2xhc3QgKQoJCQl7CgkJCQltYXRyLmF0KGluZCkgPSBtYXRyLmF0KGluZCArIDEpOwoJCQkJKytpbmQ7CgkJCX0KCQkJbWF0ci5hdChpbmRfbGFzdCkgPSBidWZmOwoJCQktLWluZF9sYXN0OwoJCX0KCQktLWluZF9sYXN0OwoJCS0tYzsKCX0KCQoJcmV0dXJuOwp9CgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIE1hdHJpeFByaW50KFQgJm1hdHIsIHR5cGVuYW1lIFQ6OnNpemVfdHlwZSByLCB0eXBlbmFtZSBUOjpzaXplX3R5cGUgYykKewoJdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCQoJdHlwZWRlZiB0eXBlbmFtZSBUOjpzaXplX3R5cGUgc2l6ZV90eXBlOwoJCglmb3IgKCBzaXplX3R5cGUgaSA9IDB1OyBpICE9IHI7ICsraSApCgl7CgkJZm9yICggc2l6ZV90eXBlIGogPSAwdTsgaiAhPSBjOyArK2ogKQoJCQljb3V0IDw8IG1hdHIuYXQoaSAqIGMgKyBqKSA8PCAiICI7CgkJY291dCA8PCBlbmRsOwoJfQoJY291dCA8PCBlbmRsOwoJCglyZXR1cm47Cn0KCgoKaW50IG1haW4oKSAKewoJdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCQoJdHlwZWRlZiB2ZWN0b3I8aW50MzJfdD4gbWF0cl90eXBlOwoJdHlwZWRlZiBtYXRyX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7Cgl0eXBlZGVmIG1hdHJfdHlwZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwoJCglzaXplX3R5cGUgciwgYzsKCXZhbHVlX3R5cGUgYnVmZjsKCXVpbnRfZmFzdDMyX3QgbnVtYmVyT2ZNYXRyaXg7CgltYXRyX3R5cGUgbWF0cjsKCQoJY2luID4+IG51bWJlck9mTWF0cml4OwoJZm9yICggdWludF9mYXN0MzJfdCBjb3VudGVyID0gMDsgY291bnRlciAhPSBudW1iZXJPZk1hdHJpeDsgKytjb3VudGVyICkKCXsKCQlyID0gYyA9IDA7CgkJY2luID4+IHIgPj4gYzsKCQlmb3IgKCBzaXplX3R5cGUgaW5kID0gMCwgZW5kID0gciAqIGM7IGluZCAhPSBlbmQ7ICsraW5kICkKCQl7CgkJCWNpbiA+PiBidWZmOwoJCQltYXRyLnB1c2hfYmFjayhidWZmKTsKCQl9CgkJCgkJLy9NYXRyaXhQcmludChtYXRyLCByLCBjKTsKCQlNYXRyaXhUcmFuc3Bvc2UobWF0ciwgciwgYyk7CgkJTWF0cml4UHJpbnQobWF0ciwgYywgcik7CgkJbWF0ci5jbGVhcigpOwoJfQoJCgkKCXJldHVybiAwOwp9
NQoKMiAyCgoxIDIKMyA0CgoKNSA1CgogMSAgMiAgMyAgNCAgNQogNiAgNyAgOCAgOSAxMAoxMSAxMiAxMyAxNCAxNQoxNiAxNyAxOCAxOSAyMAoyMSAyMiAyMyAyNCAyNQoKCjIgNQoKMSAyIDMgNCA1CjYgNyA4IDkgMTAKCgo1IDIKCjEgMgozIDQKNSA2CjcgOAo5IDEwCgoKMyA1CgogMSAgMiAgMyAgNCAgNQogNiAgNyAgOCAgOSAxMAoxMSAxMiAxMyAxNCAxNQo=
5
2 2
1 2
3 4
5 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
2 5
1 2 3 4 5
6 7 8 9 10
5 2
1 2
3 4
5 6
7 8
9 10
3 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15