public void scanToSubBlock(long subFP) {
    assert !isLeafBlock;
    //if (DEBUG) System.out.println("  scanToSubBlock fp=" + fp + " subFP=" + subFP + " entCount=" + entCount + " lastSubFP=" + lastSubFP);
    //assert nextEnt == 0;
    if (lastSubFP == subFP) {
      //if (DEBUG) System.out.println("    already positioned");
      return;
    }
    assert subFP < fp : "fp=" + fp + " subFP=" + subFP;
    final long targetSubCode = fp - subFP;
    //if (DEBUG) System.out.println("    targetSubCode=" + targetSubCode);
    while(true) {
      assert nextEnt < entCount;
      nextEnt++;
      final int code = suffixesReader.readVInt();
      if (versionAutoPrefix == false) {
        suffixesReader.skipBytes(code >>> 1);
        if ((code & 1) != 0) {
          final long subCode = suffixesReader.readVLong();
          if (targetSubCode == subCode) {
            //if (DEBUG) System.out.println("        match!");
            lastSubFP = subFP;
            return;
          }
        } else {
          state.termBlockOrd++;
        }
      } else {
        int flag = code & 3;
        suffixesReader.skipBytes(code >>> 2);
        //if (DEBUG) System.out.println("    " + nextEnt + " (of " + entCount + ") ent isSubBlock=" + ((code&1)==1));
        if (flag == 1) {
          // Sub-block
          final long subCode = suffixesReader.readVLong();
          //if (DEBUG) System.out.println("      subCode=" + subCode);
          if (targetSubCode == subCode) {
            //if (DEBUG) System.out.println("        match!");
            lastSubFP = subFP;
            return;
          }
        } else {
          state.termBlockOrd++;
          if (flag == 2 || flag == 3) {
            // Floor'd prefix term
            suffixesReader.readByte();
          }
        }
      }
    }
  }