public static byte[] safeUnion(byte[] Q, byte[] R) {
    byte q = (byte)Math.round((Math.log(Q.length)/LOG_2));
    byte r = (byte)Math.round((Math.log(R.length)/LOG_2));
    byte minp = (byte)Math.min(q, r);
    byte[] S = safeFold(Q, minp);
    byte[] T = safeFold(R, minp);
    for(int i = 0; i < S.length; i++) {
      S[i] = (byte)Math.max(S[i], T[i]);
    }
    return S;
  }