/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static class Matrix<T> {
private ArrayList<T> array;
private int rows;
private int columns;
public Matrix(int rows, int columns) {
this.
array = new ArrayList
<T
>(Collections.
nCopies(rows
* columns,
(T
)null)); this.rows = rows;
this.columns = columns;
}
public T get(int row, int col) {
return this.array.get(row * this.columns + col);
}
public T set(int row, int col, T n) {
return this.array.set(row * this.columns + col, n);
}
public Stripe row(int row) { return this.new Stripe(row, true); }
public Stripe column(int col) { return this.new Stripe(col, false); }
public class Stripe implements List<T> {
private class StripeIterator implements ListIterator<T> {
private int curr;
private int from;
public StripeIterator() { this(0); }
public StripeIterator(int from) { this.curr = from; this.from = from; }
public boolean hasNext() { return this.curr < Stripe.this.size(); }
public boolean hasPrevious() { return this.curr > this.from; }
public T next() { return Stripe.this.get(curr++); }
public int nextIndex() { return this.curr + 1; }
public T previous() { return Stripe.this.get(curr--); }
public int previousIndex() { return this.curr + 1; }
public void set(T n) { Stripe.this.set(this.curr - 1, n); }
}
private int i;
private boolean isRow;
private int from;
private int to;
private Stripe(int i, boolean isRow) {
this(i, isRow, 0, 0);
this.to = (isRow) ? Matrix.this.columns : Matrix.this.rows;
}
private Stripe(int i, boolean isRow, int from, int to) {
this.i = i;
this.isRow = isRow;
this.from = from;
this.to = to;
}
// Operations that modify the size are now allowed by the contract of
// this class. In fact they are optional as far as `List` is concerned.
public boolean addAll(Collection<? extends T> c)
public boolean addAll(int index, Collection<? extends T> c)
public boolean contains
(Object o
) { for (int c = 0; c < this.size(); c++)
if (this.get(c).equals(o))
return true;
return false;
}
public boolean containsAll(Collection<?> c) {
if (!this.contains(e))
return false;
return true;
}
public T get(int k) {
if (this.isRow) return Matrix.this.get(this.i, k + this.from);
else return Matrix.this.get(k + this.from, this.i);
}
public int hashCode() {
int hashCode = 1;
for (T e : this)
hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
return hashCode;
}
public int indexOf
(Object o
) { for (int j = 0; j < this.size(); j++)
if (this.get(j).equals(o))
return j;
return -1;
}
public boolean isEmpty() {
return false;
}
public Iterator<T> iterator() {
return this.listIterator();
}
public ListIterator<T> listIterator() {
return this.new StripeIterator();
}
public ListIterator<T> listIterator(int from) {
return this.new StripeIterator(from);
}
public int lastIndexOf
(Object o
) { int last = -1;
for (int j = 0; j < this.size(); j++)
if (this.get(j).equals(o))
last = j;
return last;
}
public T set(int k, T n) {
if (this.isRow) return Matrix.this.set(this.i, k + this.from, n);
else return Matrix.this.set(k + this.from, this.i, n);
}
public int size() { return this.to - this.from; }
public List<T> subList(int fromIndex, int toIndex) {
return new Stripe(this.i, this.isRow, fromIndex, toIndex);
}
for (int i = 0; i < this.size(); i++)
arr[i] = this.get(i);
return arr;
}
public <E> E[] toArray(E[] arr) {
if (arr.length < this.size()) {
return (E[]) this.toArray();
} else {
for (int i = 0; i < this.size(); i++)
arr[i] = (E) this.get(i);
for (int i = this.size(); i < arr.length; i++)
arr[i] = null;
return arr;
}
}
}
}
{
Matrix<String> x = new Matrix<String>(2, 5);
x.set(0, 0, "1");
x.set(0, 1, "2");
x.set(0, 2, "3");
x.set(0, 3, "4");
x.set(0, 4, "5");
x.set(1, 0, "6");
x.set(1, 1, "7");
x.set(1, 2, "8");
x.set(1, 3, "9");
x.set(1, 4, "10");
System.
out.
print("Row 0\n\t"); System.
out.
print("\nRow 1\n\t"); System.
out.
print("\nCol 0\n\t"); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCQpwdWJsaWMgc3RhdGljIGNsYXNzIE1hdHJpeDxUPiB7CgogICAgcHJpdmF0ZSBBcnJheUxpc3Q8VD4gYXJyYXk7CiAgICBwcml2YXRlIGludCByb3dzOwogICAgcHJpdmF0ZSBpbnQgY29sdW1uczsKCiAgICBwdWJsaWMgTWF0cml4KGludCByb3dzLCBpbnQgY29sdW1ucykgewogICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgQXJyYXlMaXN0PFQ+KENvbGxlY3Rpb25zLm5Db3BpZXMocm93cyAqIGNvbHVtbnMsIChUKW51bGwpKTsKICAgICAgICB0aGlzLnJvd3MgPSByb3dzOwogICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CiAgICB9CgogICAgcHVibGljIFQgZ2V0KGludCByb3csIGludCBjb2wpIHsKICAgICAgICByZXR1cm4gdGhpcy5hcnJheS5nZXQocm93ICogdGhpcy5jb2x1bW5zICsgY29sKTsKICAgIH0KCiAgICBwdWJsaWMgVCBzZXQoaW50IHJvdywgaW50IGNvbCwgVCBuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkuc2V0KHJvdyAqIHRoaXMuY29sdW1ucyArIGNvbCwgbik7CiAgICB9CgogICAgcHVibGljIFN0cmlwZSByb3coaW50IHJvdykgeyByZXR1cm4gdGhpcy5uZXcgU3RyaXBlKHJvdywgdHJ1ZSk7IH0KICAgIHB1YmxpYyBTdHJpcGUgY29sdW1uKGludCBjb2wpIHsgcmV0dXJuIHRoaXMubmV3IFN0cmlwZShjb2wsIGZhbHNlKTsgfQoKICAgIHB1YmxpYyBjbGFzcyBTdHJpcGUgaW1wbGVtZW50cyBMaXN0PFQ+IHsKCiAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdHJpcGVJdGVyYXRvciBpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxUPiB7CiAgICAgICAgICAgIHByaXZhdGUgaW50IGN1cnI7CiAgICAgICAgICAgIHByaXZhdGUgaW50IGZyb207CgogICAgICAgICAgICBwdWJsaWMgU3RyaXBlSXRlcmF0b3IoKSB7IHRoaXMoMCk7IH0KICAgICAgICAgICAgcHVibGljIFN0cmlwZUl0ZXJhdG9yKGludCBmcm9tKSB7IHRoaXMuY3VyciA9IGZyb207IHRoaXMuZnJvbSA9IGZyb207IH0KICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkKFQgZSkgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQogICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeyByZXR1cm4gdGhpcy5jdXJyIDwgU3RyaXBlLnRoaXMuc2l6ZSgpOyB9CiAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeyByZXR1cm4gdGhpcy5jdXJyID4gdGhpcy5mcm9tOyB9CiAgICAgICAgICAgIHB1YmxpYyBUIG5leHQoKSB7IHJldHVybiBTdHJpcGUudGhpcy5nZXQoY3VycisrKTsgfQogICAgICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsgcmV0dXJuIHRoaXMuY3VyciArIDE7IH0KICAgICAgICAgICAgcHVibGljIFQgcHJldmlvdXMoKSB7IHJldHVybiBTdHJpcGUudGhpcy5nZXQoY3Vyci0tKTsgfQogICAgICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7IHJldHVybiB0aGlzLmN1cnIgKyAxOyB9CiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFQgbikgeyBTdHJpcGUudGhpcy5zZXQodGhpcy5jdXJyIC0gMSwgbik7IH0KICAgICAgICB9CgogICAgICAgIHByaXZhdGUgaW50IGk7CiAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUm93OwogICAgICAgIHByaXZhdGUgaW50IGZyb207CiAgICAgICAgcHJpdmF0ZSBpbnQgdG87CgogICAgICAgIHByaXZhdGUgU3RyaXBlKGludCBpLCBib29sZWFuIGlzUm93KSB7CiAgICAgICAgICAgIHRoaXMoaSwgaXNSb3csIDAsIDApOwogICAgICAgICAgICB0aGlzLnRvID0gKGlzUm93KSA/IE1hdHJpeC50aGlzLmNvbHVtbnMgOiBNYXRyaXgudGhpcy5yb3dzOwogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSBTdHJpcGUoaW50IGksIGJvb2xlYW4gaXNSb3csIGludCBmcm9tLCBpbnQgdG8pIHsKICAgICAgICAgICAgdGhpcy5pID0gaTsKICAgICAgICAgICAgdGhpcy5pc1JvdyA9IGlzUm93OwogICAgICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwogICAgICAgICAgICB0aGlzLnRvID0gdG87CiAgICAgICAgfQoKICAgICAgICAvLyBPcGVyYXRpb25zIHRoYXQgbW9kaWZ5IHRoZSBzaXplIGFyZSBub3cgYWxsb3dlZCBieSB0aGUgY29udHJhY3Qgb2YKICAgICAgICAvLyB0aGlzIGNsYXNzLiBJbiBmYWN0IHRoZXkgYXJlIG9wdGlvbmFsIGFzIGZhciBhcyBgTGlzdGAgaXMgY29uY2VybmVkLgogICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChUIGUpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KICAgICAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGksIFQgZSkgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQogICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjKSAKICAgICAgICAgICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQogICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpIAogICAgICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CiAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CiAgICAgICAgcHVibGljIFQgcmVtb3ZlKGludCBpbmRleCkgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQogICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQogICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CgogICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7IAogICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHRoaXMuc2l6ZSgpOyBjKyspCiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXQoYykuZXF1YWxzKG8pKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKICAgICAgICAgICAgZm9yIChPYmplY3QgZSA6IGMpCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbnMoZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBUIGdldChpbnQgaykgeyAKICAgICAgICAgICAgaWYgKHRoaXMuaXNSb3cpIHJldHVybiBNYXRyaXgudGhpcy5nZXQodGhpcy5pLCBrICsgdGhpcy5mcm9tKTsKICAgICAgICAgICAgZWxzZSByZXR1cm4gTWF0cml4LnRoaXMuZ2V0KGsgKyB0aGlzLmZyb20sIHRoaXMuaSk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICAgICBpbnQgaGFzaENvZGUgPSAxOwogICAgICAgICAgICBmb3IgKFQgZSA6IHRoaXMpCiAgICAgICAgICAgICAgICBoYXNoQ29kZSA9IDMxICogaGFzaENvZGUgKyAoZSA9PSBudWxsID8gMCA6IGUuaGFzaENvZGUoKSk7CiAgICAgICAgICAgIHJldHVybiBoYXNoQ29kZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRoaXMuc2l6ZSgpOyBqKyspCiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXQoaikuZXF1YWxzKG8pKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBqOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm5ldyBTdHJpcGVJdGVyYXRvcigpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoaW50IGZyb20pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3IFN0cmlwZUl0ZXJhdG9yKGZyb20pOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewogICAgICAgICAgICBpbnQgbGFzdCA9IC0xOwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRoaXMuc2l6ZSgpOyBqKyspCiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXQoaikuZXF1YWxzKG8pKQogICAgICAgICAgICAgICAgICAgIGxhc3QgPSBqOwogICAgICAgICAgICByZXR1cm4gbGFzdDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBUIHNldChpbnQgaywgVCBuKSB7IAogICAgICAgICAgICBpZiAodGhpcy5pc1JvdykgcmV0dXJuIE1hdHJpeC50aGlzLnNldCh0aGlzLmksIGsgKyB0aGlzLmZyb20sIG4pOwogICAgICAgICAgICBlbHNlIHJldHVybiBNYXRyaXgudGhpcy5zZXQoayArIHRoaXMuZnJvbSwgdGhpcy5pLCBuKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMudG8gLSB0aGlzLmZyb207IH0gCgogICAgICAgIHB1YmxpYyBMaXN0PFQ+IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpcGUodGhpcy5pLCB0aGlzLmlzUm93LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CiAgICAgICAgICAgIE9iamVjdFtdIGFyciA9IG5ldyBPYmplY3RbdGhpcy5zaXplKCldOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2l6ZSgpOyBpKyspCiAgICAgICAgICAgICAgICBhcnJbaV0gPSB0aGlzLmdldChpKTsKICAgICAgICAgICAgcmV0dXJuIGFycjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyA8RT4gRVtdIHRvQXJyYXkoRVtdIGFycikgewogICAgICAgICAgICBpZiAoYXJyLmxlbmd0aCA8IHRoaXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKEVbXSkgdGhpcy50b0FycmF5KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2l6ZSgpOyBpKyspCiAgICAgICAgICAgICAgICAgICAgYXJyW2ldID0gKEUpIHRoaXMuZ2V0KGkpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMuc2l6ZSgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIGFycltpXSA9IG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICB9Cgp9CgoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJTWF0cml4PFN0cmluZz4geCA9IG5ldyBNYXRyaXg8U3RyaW5nPigyLCA1KTsKCQl4LnNldCgwLCAwLCAiMSIpOwoJCXguc2V0KDAsIDEsICIyIik7CgkJeC5zZXQoMCwgMiwgIjMiKTsKCQl4LnNldCgwLCAzLCAiNCIpOwoJCXguc2V0KDAsIDQsICI1Iik7CgkJeC5zZXQoMSwgMCwgIjYiKTsKCQl4LnNldCgxLCAxLCAiNyIpOwoJCXguc2V0KDEsIDIsICI4Iik7CgkJeC5zZXQoMSwgMywgIjkiKTsKCQl4LnNldCgxLCA0LCAiMTAiKTsKCQkKCQlTeXN0ZW0ub3V0LnByaW50KCJSb3cgMFxuXHQiKTsKCQlmb3IgKFN0cmluZyBhIDogeC5yb3coMCkpCgkJCVN5c3RlbS5vdXQucHJpbnQoYSArICIgIik7CgkJU3lzdGVtLm91dC5wcmludCgiXG5Sb3cgMVxuXHQiKTsKCQlmb3IgKFN0cmluZyBiIDogeC5yb3coMSkpCgkJCVN5c3RlbS5vdXQucHJpbnQoYiArICIgIik7CgkJU3lzdGVtLm91dC5wcmludCgiXG5Db2wgMFxuXHQiKTsKCQlmb3IgKFN0cmluZyBiIDogeC5jb2x1bW4oMCkpCgkJCVN5c3RlbS5vdXQucHJpbnQoYiArICIgIik7Cgl9Cn0=