#include <iostream>
#include <string>
#include <vector>
#include <cstddef>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <sstream>
// 29.01.18
// PP0502B
using namespace std;
class PP0502B {
public:
PP0502B(int numsets) : _ns(numsets)
{
int index, delimiter = ' ';
string sset;
vector<int> a;
for(index = 0; index < _ns; index++)
{
getline(cin, sset);
a = explode(sset, delimiter);
cin.clear();
_vi.push_back(a);
}
vector<int> t;
int first = 0, ti;
for(index = 0; index < _ns; index++)
{
t = _vi[index];
first = popfront(t);
t.resize(first);
reverse(t);
for(ti = 0; ti < t.size(); ti++)
{
if(t[ti] != 0) {
cout << t[ti];
cout << (ti == (t.size() - 1)?"":" ");
}
}
cout << "\n";
}
}
friend ostream& operator<<(ostream& os, const PP0502B& f);
private:
int _ns; // liczba zbiorow
vector< vector<int> > _vi; // wektor wektorow liczb
private:
void reverse(vector<int>& vi)
{
int vs, index;
vs = vi.size();
for(index = 0; index < vs / 2; index++)
{
swap(vi[index], vi[vs - index - 1]); // odwracanie
}
}
int popfront(vector<int>& vi)
{
int index, vs, newcapacity, firstelement;
vs = vi.size();
firstelement = vi[0]; // zdejmuje pierwsza liczbe
newcapacity = vs - 1;
vector<int> nvi(newcapacity);
for(index = 1; index < vs; index++)
{
nvi[index-1] = vi[index]; // kopiuje do nowego w.
}
vi.clear(); // czysci stary
vector<int>().swap(vi); // https://stackoverflow.com/a/10465032
vi = nvi; // referencja
return firstelement;
}
// funkcje pomocnicze
// wycina X znakow z ciagu tekstowego i konwertujemy do int
int strtoint(const char *string, int tocopy){int number;char *t;t = (char *)malloc(sizeof(char) * tocopy);memcpy(t, string, tocopy);number = atoi(static_cast<const char*>(t));free(t);return number;}
// obcina space z lewa i prawa
char* trimstring(const char *sp){const char *p, *q;char *t;int length, temp;p = q = sp;while(*q != '\0') {q++;};while(*p == ' '){p++;};while(*q == ' ' || *q == '\0') {q--;}q++;length = q - p;t = (char *)malloc(sizeof(char) * length);memcpy(t, p, length);return t;}
// pobiera liczbe oddzielajacych ciag tekstowy znakow (tutj: ' ')
const char* getnumdelimiters(const char *s, int delimiter, int *ret){int numdelimiters = 0;while(*s++ != '\0'){if(*s == delimiter) numdelimiters++;}*ret = numdelimiters;return s;}
// usuwa zbedne ' ' pomiedzy znakami (zostawia jedno)
const char* convertstringtorightformat(const char *sp, int delimiter){const char *p, *q;char *s, *t;int length, first = 1, index = 0, temp = 0;s = trimstring(sp);q = p = s;while(*q++ != '\0'){if(*q == delimiter){q++;}};length = q - p;t = (char *)malloc(sizeof(char) * length);while(p != q){if(*p == delimiter){if(first == 1){first = 0;memcpy(&t[index], p, sizeof(char));}while(*p == delimiter){temp++;p++;}if(temp > 0){p--;}} else {first = 1;memcpy(&t[index], p, sizeof(char));}index++;p++;}return t;}
// konwertuje np. '1 2 3 4 5 6 7 8' do wektora int'ow
vector<int> explode(string& inputs, int delimiter){vector<int> ret;const char *p, *q, *s;int numdelimiters = 0, index, tocopy, number;s = strdup(inputs.c_str());s = convertstringtorightformat(s, delimiter);q = p = s;s = getnumdelimiters(s, delimiter, &numdelimiters);for(index = 0; index < numdelimiters; index++){while(*q++ != delimiter);tocopy = q - p;if(tocopy < 1){break;}; number = strtoint(p, tocopy);ret.push_back(number);p = q;}if(p < s){tocopy = s - p - 1;number = strtoint(p, tocopy);ret.push_back(number);}return ret;}
};
ostream& operator<<(ostream& os, const PP0502B& f)
{
//
return os;
}
int main()
{
int numsets;
string input;
getline(cin, input);
numsets = atoi(input.c_str());
PP0502B pp0502b(numsets);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGRlZj4KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8c3N0cmVhbT4KCi8vIDI5LjAxLjE4Ci8vIFBQMDUwMkIKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBQUDA1MDJCIHsKICAgIHB1YmxpYzoKICAgICAgICBQUDA1MDJCKGludCBudW1zZXRzKSA6IF9ucyhudW1zZXRzKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGluZGV4LCBkZWxpbWl0ZXIgPSAnICc7CiAgICAgICAgICAgIHN0cmluZyBzc2V0OwogICAgICAgICAgICB2ZWN0b3I8aW50PiBhOwogICAgICAgICAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IF9uczsgaW5kZXgrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ2V0bGluZShjaW4sIHNzZXQpOwogICAgICAgICAgICAgICAgYSA9IGV4cGxvZGUoc3NldCwgZGVsaW1pdGVyKTsKICAgICAgICAgICAgICAgIGNpbi5jbGVhcigpOwogICAgICAgICAgICAgICAgX3ZpLnB1c2hfYmFjayhhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdmVjdG9yPGludD4gdDsKICAgICAgICAgICAgaW50IGZpcnN0ID0gMCwgdGk7CiAgICAgICAgICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgX25zOyBpbmRleCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ID0gX3ZpW2luZGV4XTsKICAgICAgICAgICAgICAgIGZpcnN0ID0gcG9wZnJvbnQodCk7CiAgICAgICAgICAgICAgICB0LnJlc2l6ZShmaXJzdCk7CiAgICAgICAgICAgICAgICByZXZlcnNlKHQpOwogICAgICAgICAgICAgICAgZm9yKHRpID0gMDsgdGkgPCB0LnNpemUoKTsgdGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgCWlmKHRbdGldICE9IDApIHsKICAgICAgICAgICAgCQljb3V0IDw8IHRbdGldOwogICAgICAgICAgICAJCWNvdXQgPDwgKHRpID09ICh0LnNpemUoKSAtIDEpPyIiOiIgIik7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IFBQMDUwMkImIGYpOwogICAgICAgIAogICAgcHJpdmF0ZToKICAgICAgICBpbnQgX25zOyAvLyBsaWN6YmEgemJpb3JvdwogICAgICAgIHZlY3RvcjwgdmVjdG9yPGludD4gPiBfdmk7IC8vIHdla3RvciB3ZWt0b3JvdyBsaWN6YgogICAgICAgIAogICAgcHJpdmF0ZToKICAgICAgICB2b2lkIHJldmVyc2UodmVjdG9yPGludD4mIHZpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHZzLCBpbmRleDsKICAgICAgICAgICAgdnMgPSB2aS5zaXplKCk7CiAgICAgICAgICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgdnMgLyAyOyBpbmRleCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2FwKHZpW2luZGV4XSwgdmlbdnMgLSBpbmRleCAtIDFdKTsgLy8gb2R3cmFjYW5pZQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGludCBwb3Bmcm9udCh2ZWN0b3I8aW50PiYgdmkpCiAgICAgICAgewogICAgICAgICAgICBpbnQgaW5kZXgsIHZzLCBuZXdjYXBhY2l0eSwgZmlyc3RlbGVtZW50OwogICAgICAgICAgICAKICAgICAgICAgICAgdnMgPSB2aS5zaXplKCk7CiAgICAgICAgICAgIGZpcnN0ZWxlbWVudCA9IHZpWzBdOyAvLyB6ZGVqbXVqZSBwaWVyd3N6YSBsaWN6YmUKICAgICAgICAgICAgbmV3Y2FwYWNpdHkgPSB2cyAtIDE7CiAgICAgICAgICAgIHZlY3RvcjxpbnQ+IG52aShuZXdjYXBhY2l0eSk7CiAgICAgICAgICAgIGZvcihpbmRleCA9IDE7IGluZGV4IDwgdnM7IGluZGV4KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG52aVtpbmRleC0xXSA9IHZpW2luZGV4XTsgLy8ga29waXVqZSBkbyBub3dlZ28gdy4KICAgICAgICAgICAgfQogICAgICAgICAgICB2aS5jbGVhcigpOyAvLyBjenlzY2kgc3RhcnkKICAgICAgICAgICAgdmVjdG9yPGludD4oKS5zd2FwKHZpKTsgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwNDY1MDMyCiAgICAgICAgICAgIHZpID0gbnZpOyAvLyByZWZlcmVuY2phCiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gZmlyc3RlbGVtZW50OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBmdW5rY2plIHBvbW9jbmljemUKICAgICAgICAvLyB3eWNpbmEgWCB6bmFrb3cgeiBjaWFndSB0ZWtzdG93ZWdvIGkga29ud2VydHVqZW15IGRvIGludAogICAgICAgIGludCBzdHJ0b2ludChjb25zdCBjaGFyICpzdHJpbmcsIGludCB0b2NvcHkpe2ludCBudW1iZXI7Y2hhciAqdDt0ID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogdG9jb3B5KTttZW1jcHkodCwgc3RyaW5nLCB0b2NvcHkpO251bWJlciA9IGF0b2koc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHQpKTtmcmVlKHQpO3JldHVybiBudW1iZXI7fQogICAgICAgIC8vIG9iY2luYSBzcGFjZSB6IGxld2EgaSBwcmF3YQogICAgICAgIGNoYXIqIHRyaW1zdHJpbmcoY29uc3QgY2hhciAqc3Ape2NvbnN0IGNoYXIgKnAsICpxO2NoYXIgKnQ7aW50IGxlbmd0aCwgdGVtcDtwID0gcSA9IHNwO3doaWxlKCpxICE9ICdcMCcpIHtxKys7fTt3aGlsZSgqcCA9PSAnICcpe3ArKzt9O3doaWxlKCpxID09ICcgJyB8fCAqcSA9PSAnXDAnKSB7cS0tO31xKys7bGVuZ3RoID0gcSAtIHA7dCA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSAqIGxlbmd0aCk7bWVtY3B5KHQsIHAsIGxlbmd0aCk7cmV0dXJuIHQ7fQogICAgICAgIC8vIHBvYmllcmEgbGljemJlIG9kZHppZWxhamFjeWNoIGNpYWcgdGVrc3Rvd3kgem5ha293ICh0dXRqOiAnICcpCiAgICAgICAgY29uc3QgY2hhciogZ2V0bnVtZGVsaW1pdGVycyhjb25zdCBjaGFyICpzLCBpbnQgZGVsaW1pdGVyLCBpbnQgKnJldCl7aW50IG51bWRlbGltaXRlcnMgPSAwO3doaWxlKCpzKysgIT0gJ1wwJyl7aWYoKnMgPT0gZGVsaW1pdGVyKSBudW1kZWxpbWl0ZXJzKys7fSpyZXQgPSBudW1kZWxpbWl0ZXJzO3JldHVybiBzO30KICAgICAgICAvLyB1c3V3YSB6YmVkbmUgJyAnIHBvbWllZHp5IHpuYWthbWkgKHpvc3Rhd2lhIGplZG5vKQogICAgICAgIGNvbnN0IGNoYXIqIGNvbnZlcnRzdHJpbmd0b3JpZ2h0Zm9ybWF0KGNvbnN0IGNoYXIgKnNwLCBpbnQgZGVsaW1pdGVyKXtjb25zdCBjaGFyICpwLCAqcTtjaGFyICpzLCAqdDtpbnQgbGVuZ3RoLCBmaXJzdCA9IDEsIGluZGV4ID0gMCwgdGVtcCA9IDA7cyA9IHRyaW1zdHJpbmcoc3ApO3EgPSBwID0gczt3aGlsZSgqcSsrICE9ICdcMCcpe2lmKCpxID09IGRlbGltaXRlcil7cSsrO319O2xlbmd0aCA9IHEgLSBwO3QgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW5ndGgpO3doaWxlKHAgIT0gcSl7aWYoKnAgPT0gZGVsaW1pdGVyKXtpZihmaXJzdCA9PSAxKXtmaXJzdCA9IDA7bWVtY3B5KCZ0W2luZGV4XSwgcCwgc2l6ZW9mKGNoYXIpKTt9d2hpbGUoKnAgPT0gZGVsaW1pdGVyKXt0ZW1wKys7cCsrO31pZih0ZW1wID4gMCl7cC0tO319IGVsc2Uge2ZpcnN0ID0gMTttZW1jcHkoJnRbaW5kZXhdLCBwLCBzaXplb2YoY2hhcikpO31pbmRleCsrO3ArKzt9cmV0dXJuIHQ7fQoJLy8ga29ud2VydHVqZSBucC4gJzEgMiAzIDQgNSA2IDcgOCcgZG8gd2VrdG9yYSBpbnQnb3cKICAgICAgICB2ZWN0b3I8aW50PiBleHBsb2RlKHN0cmluZyYgaW5wdXRzLCBpbnQgZGVsaW1pdGVyKXt2ZWN0b3I8aW50PiByZXQ7Y29uc3QgY2hhciAqcCwgKnEsICpzO2ludCBudW1kZWxpbWl0ZXJzID0gMCwgaW5kZXgsIHRvY29weSwgbnVtYmVyO3MgPSBzdHJkdXAoaW5wdXRzLmNfc3RyKCkpO3MgPSBjb252ZXJ0c3RyaW5ndG9yaWdodGZvcm1hdChzLCBkZWxpbWl0ZXIpO3EgPSBwID0gcztzID0gZ2V0bnVtZGVsaW1pdGVycyhzLCBkZWxpbWl0ZXIsICZudW1kZWxpbWl0ZXJzKTtmb3IoaW5kZXggPSAwOyBpbmRleCA8IG51bWRlbGltaXRlcnM7IGluZGV4Kyspe3doaWxlKCpxKysgIT0gZGVsaW1pdGVyKTt0b2NvcHkgPSBxIC0gcDtpZih0b2NvcHkgPCAxKXticmVhazt9OyBudW1iZXIgPSBzdHJ0b2ludChwLCB0b2NvcHkpO3JldC5wdXNoX2JhY2sobnVtYmVyKTtwID0gcTt9aWYocCA8IHMpe3RvY29weSA9IHMgLSBwIC0gMTtudW1iZXIgPSBzdHJ0b2ludChwLCB0b2NvcHkpO3JldC5wdXNoX2JhY2sobnVtYmVyKTt9cmV0dXJuIHJldDt9Cn07Cgpvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCBjb25zdCBQUDA1MDJCJiBmKQp7CiAgICAvLyAKICAgIAogICAgcmV0dXJuIG9zOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBudW1zZXRzOwogICAgc3RyaW5nIGlucHV0OwogICAgCiAgICBnZXRsaW5lKGNpbiwgaW5wdXQpOwogICAgbnVtc2V0cyA9IGF0b2koaW5wdXQuY19zdHIoKSk7CgogICAgUFAwNTAyQiBwcDA1MDJiKG51bXNldHMpOwp9