#include <iostream>
#include <algorithm>
#include <chrono>
#include <random>
#include <vector>
#include <iomanip>
template <class IntType>
IntType random(IntType a, IntType b) {
static std::minstd_rand generator(
static_cast<unsigned>(
std::chrono::system_clock::now().time_since_epoch().count()
)
);
std::uniform_int_distribution<int> distribution(a, b);
return distribution(generator);
}
using Matrix = std::vector<std::vector<int>>;
std::ostream& operator<< (std::ostream& out, Matrix const& matrix) {
int offset = out.width();
for(auto const& row: matrix) {
out << std::setw(offset);
for(auto const& element: row) {
out << ' ' << std::setw(4) << std::left << element;
}
out << '\n';
}
return out;
}
int main() {
Matrix matrix(random(5u, 10u));
std::generate(matrix.begin(), matrix.end(), [] {
std::vector<int> row(random(5u, 10u));
std::generate(row.begin(), row.end(), [] { return random(0, 100); });
return row;
});
std::cout << std::setw(5) << matrix << '\n';
int k = 4;
for(size_t row = 1; row < matrix.size(); row += 2) {
std::rotate(matrix[row].begin(), matrix[row].begin() + k, matrix[row].end());
}
std::cout << "After rotate odd rows on " << k << " elements to left: \n"
<< std::setw(5) << matrix << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aW9tYW5pcD4KCnRlbXBsYXRlIDxjbGFzcyBJbnRUeXBlPgpJbnRUeXBlIHJhbmRvbShJbnRUeXBlIGEsIEludFR5cGUgYikgewogICAgc3RhdGljIHN0ZDo6bWluc3RkX3JhbmQgZ2VuZXJhdG9yKAogICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPigKICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkKICAgICAgICApCiAgICApOwogICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiBkaXN0cmlidXRpb24oYSwgYik7CiAgICByZXR1cm4gZGlzdHJpYnV0aW9uKGdlbmVyYXRvcik7Cn0KCnVzaW5nIE1hdHJpeCA9IHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+OwpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgb3V0LCBNYXRyaXggY29uc3QmIG1hdHJpeCkgewogICAgaW50IG9mZnNldCA9IG91dC53aWR0aCgpOwogICAgZm9yKGF1dG8gY29uc3QmIHJvdzogbWF0cml4KSB7CiAgICAgICAgb3V0IDw8IHN0ZDo6c2V0dyhvZmZzZXQpOwogICAgICAgIAogICAgICAgIGZvcihhdXRvIGNvbnN0JiBlbGVtZW50OiByb3cpIHsKICAgICAgICAgICAgb3V0IDw8ICcgJyA8PCBzdGQ6OnNldHcoNCkgPDwgc3RkOjpsZWZ0IDw8IGVsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIG91dCA8PCAnXG4nOwogICAgfQogICAgCiAgICByZXR1cm4gb3V0Owp9CmludCBtYWluKCkgewogICAgTWF0cml4IG1hdHJpeChyYW5kb20oNXUsIDEwdSkpOwogICAgc3RkOjpnZW5lcmF0ZShtYXRyaXguYmVnaW4oKSwgbWF0cml4LmVuZCgpLCBbXSB7CiAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiByb3cocmFuZG9tKDV1LCAxMHUpKTsKICAgICAgICBzdGQ6OmdlbmVyYXRlKHJvdy5iZWdpbigpLCByb3cuZW5kKCksIFtdIHsgcmV0dXJuIHJhbmRvbSgwLCAxMDApOyB9KTsKICAgICAgICByZXR1cm4gcm93OwogICAgfSk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoNSkgPDwgbWF0cml4IDw8ICdcbic7CiAgICAKICAgIGludCBrID0gNDsKICAgIGZvcihzaXplX3Qgcm93ID0gMTsgcm93IDwgbWF0cml4LnNpemUoKTsgcm93ICs9IDIpIHsKICAgICAgICBzdGQ6OnJvdGF0ZShtYXRyaXhbcm93XS5iZWdpbigpLCBtYXRyaXhbcm93XS5iZWdpbigpICsgaywgbWF0cml4W3Jvd10uZW5kKCkpOwogICAgfQogICAgCiAgICBzdGQ6OmNvdXQgPDwgIkFmdGVyIHJvdGF0ZSBvZGQgcm93cyBvbiAiIDw8IGsgPDwgIiBlbGVtZW50cyB0byBsZWZ0OiBcbiIKICAgICAgICAgICAgICA8PCBzdGQ6OnNldHcoNSkgPDwgbWF0cml4IDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgCiAgICByZXR1cm4gMDsKfQ==