docs: protected final int findOffset(int idx) {
      if(idx >= _len)throw new IndexOutOfBoundsException();
      int sparseLen = sparseLen();
      if(sparseLen == 0)return 0;
      final byte [] mem = _mem;
      if(idx <= getId(OFF))  // easy cut off accessing the zeros prior first nz
        return OFF;
      int last = mem.length - _ridsz - _valsz;
      if(idx >= getId(last))  // easy cut off accessing of the tail zeros
        return last;
      final int off = _lastOff;
      int lastIdx = getId(off);
      // check the last accessed elem + one after
      if( idx == lastIdx ) return off;
      if(idx > lastIdx){
        // check the next one (no need to check bounds, already checked at the beginning)
        final int nextOff = off + _ridsz + _valsz;
        int nextId =  getId(nextOff);
        if(idx < nextId) return off;
        if(idx == nextId){
          _lastOff = nextOff;
          return nextOff;
        }
      }
      // binary search
      int lo=0, hi = sparseLen;
      while( lo+1 != hi ) {
        int mid = (hi+lo)>>>1;
        if( idx < getId(getOff(mid))) hi = mid;
        else          lo = mid;
      }
      int y =  getOff(lo);
      _lastOff = y;
      return y;
    }