def gen_ops(x: int, y: int): v = [0, 1, 2] # keep [0] = x ops = [(v[0], v[2], v[1])] for i in range(y.bit_length() - 1)[::-1]: ops.append((v[1], v[1], v[2])) if y >> i & 1: ops.append((v[0], v[2], v[1])) else: v[1], v[2] = v[2], v[1] return ops, v[1] def check_ops(x, y): ops, c = gen_ops(x, y) v = [x, y, 0] for i, j, k in ops: if i == k or j == k: return False v[k] = v[i] + v[j] return v[c] == x * y def f_print(*args): print(*args, flush=True) def ask1(p: int): v = "ABC"[p] f_print("?", v) z = int(input()) if z == -1: exit() return z def ask2(p1: int, p2: int, p3: int): v1 = "ABC"[p1] v2 = "ABC"[p2] v3 = "ABC"[p3] f_print("+", v1, v2, v3) z = int(input()) if z == -1: exit() return z from collections import Counter def get0(p: int): """[p] の値を調べる""" g0 = 2 c = Counter() while True: z = ask1(p) c[z] += 1 if c[z] >= g0: return z x = get0(0) y = get0(1) ops, ch = gen_ops(x, y) v = [x, y, 0] for i, j, k in ops: v[k] = v[i] + v[j] while True: ask2(i, j, k) if get0(k) == v[k]: break f_print("!", "ABC"[ch])