static class Grid { int[] mem = new int[0]; *() {} *(int[] data) { set(0, data); } void set(int addr, int x) { if (addr < 0) ret; expandTo(addr); mem[addr] = x; } void set(int addr, int[] x) { for (int i = l(x)-1; i >= 0; i--) set(addr+i, x[i]); } int get(int addr) { if (addr < 0 || addr >= l(mem)) ret 0; ret mem[addr]; } void expandTo(int n) { if (n >= l(mem)) { int[] m = new int[max(n+1, l(mem)*2)]; arraycopy(mem, 0, m, 0, l(mem)); mem = m; } } int lastNonZero() { int i = l(mem)-1; while (i > 0 && get(i) == 0) --i; ret i; } int[] getRange(int a, int b) { ret subArray(mem, a, b); } void swap(int a, int b) { int i = get(a); set(a, get(b)); set(b, i); } }