← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

var in = bufio.NewReaderSize(os.Stdin, 1<<20)
var out = bufio.NewWriterSize(os.Stdout, 1<<20)

func ask(a, b, c int) int {
	fmt.Fprintf(out, "? %d %d %d\n", a, b, c)
	out.Flush()
	var x int
	fmt.Fscan(in, &x)
	if x == -1 {
		os.Exit(0)
	}
	return x
}

func answer(ans []int, n int) {
	fmt.Fprint(out, "!")
	for i := 1; i <= n; i++ {
		fmt.Fprintf(out, " %d", ans[i])
	}
	fmt.Fprint(out, "\n")
	out.Flush()
	var ok int
	fmt.Fscan(in, &ok)
	if ok != 1 {
		os.Exit(0)
	}
}

func med(x, y, z int) int {
	if x > y {
		x, y = y, x
	}
	if y > z {
		y, z = z, y
	}
	if x > y {
		x, y = y, x
	}
	if y-x > z-y {
		return y - x
	}
	return z - y
}

func fRel(d, y int) int {
	if y < 0 {
		if -y > d {
			return -y
		}
		return d
	}
	if y > d {
		if y-d > d {
			return y - d
		}
		return d
	}
	if y > d-y {
		return y
	}
	return d - y
}

func solveD1(n int, q1 []int) {
	cand := make([]int, 0, 2)
	x2 := 0
	for i := 3; i <= n; i++ {
		if q1[i] == 1 {
			cand = append(cand, i)
		}
		if q1[i] == 2 && x2 == 0 {
			x2 = i
		}
	}

	idxA2 := 0
	idxAm1 := 0
	for _, c := range cand {
		r := ask(1, c, x2)
		if r == 2 {
			idxA2 = c
		} else {
			idxAm1 = c
		}
	}

	q2 := make([]int, n+1)
	offset := make([]int, n+1)

	if idxA2 != 0 {
		for i := 1; i <= n; i++ {
			if i == 2 || i == idxA2 {
				continue
			}
			q2[i] = ask(2, idxA2, i)
		}
		offset[1] = 0
		offset[2] = 1
		offset[idxA2] = 2
		for i := 1; i <= n; i++ {
			if i == 1 || i == 2 || i == idxA2 {
				continue
			}
			u, v := q1[i], q2[i]
			if v == u+1 {
				offset[i] = -u
			} else {
				offset[i] = u + 1
			}
		}
	} else {
		if idxAm1 == 0 && len(cand) > 0 {
			idxAm1 = cand[0]
		}
		for i := 1; i <= n; i++ {
			if i == 1 || i == idxAm1 {
				continue
			}
			q2[i] = ask(idxAm1, 1, i)
		}
		offset[idxAm1] = -1
		offset[1] = 0
		offset[2] = 1
		for i := 1; i <= n; i++ {
			if i == 1 || i == 2 || i == idxAm1 {
				continue
			}
			u, v := q1[i], q2[i]
			if u == v+1 {
				offset[i] = -u
			} else {
				offset[i] = v
			}
		}
	}

	minY := offset[1]
	for i := 2; i <= n; i++ {
		if offset[i] < minY {
			minY = offset[i]
		}
	}
	A := 1 - minY

	ans := make([]int, n+1)
	for i := 1; i <= n; i++ {
		ans[i] = A + offset[i]
	}
	answer(ans, n)
}

func solveCase(n int) {
	q1 := make([]int, n+1)
	cnt1 := make([]int, n+1)
	minq := n + 1

	for i := 3; i <= n; i++ {
		q := ask(1, 2, i)
		q1[i] = q
		cnt1[q]++
		if q < minq {
			minq = q
		}
	}

	D := 2*minq - 1
	if cnt1[minq] == 1 {
		D = 2 * minq
	}

	if D == 1 {
		solveD1(n, q1)
		return
	}

	cand := make([]int, 0, 2)
	for i := 3; i <= n; i++ {
		if q1[i] == D-1 {
			cand = append(cand, i)
		}
	}

	idxA1 := 0
	if D == 2 {
		idxA1 = cand[0]
	} else if D == 3 {
		x := 0
		for i := 3; i <= n; i++ {
			if q1[i] > 3 {
				x = i
				break
			}
		}
		a0 := ask(1, cand[0], x)
		b0 := ask(2, cand[0], x)
		a1 := ask(1, cand[1], x)
		b1 := ask(2, cand[1], x)
		if a0 != a1 {
			if a0 > a1 {
				idxA1 = cand[0]
			} else {
				idxA1 = cand[1]
			}
		} else {
			if b0 < b1 {
				idxA1 = cand[0]
			} else {
				idxA1 = cand[1]
			}
		}
	} else {
		mid := 0
		for i := 3; i <= n; i++ {
			if q1[i] == minq {
				mid = i
				break
			}
		}
		r0 := ask(1, cand[0], mid)
		r1 := ask(1, cand[1], mid)
		if r0 < r1 {
			idxA1 = cand[0]
		} else {
			idxA1 = cand[1]
		}
	}

	q2 := make([]int, n+1)
	for i := 1; i <= n; i++ {
		if i == 1 || i == idxA1 {
			continue
		}
		q2[i] = ask(1, idxA1, i)
	}

	offset := make([]int, n+1)
	offset[1] = 0
	offset[idxA1] = 1
	offset[2] = D

	amb := make([]int, 0, 2)

	for i := 1; i <= n; i++ {
		if i == 1 || i == 2 || i == idxA1 {
			continue
		}
		s := q2[i]
		poss := 0
		val := 0

		y := -s
		if fRel(D, y) == q1[i] {
			poss++
			val = y
		}

		y = 1 + s
		if y != D && fRel(D, y) == q1[i] {
			if poss == 0 {
				val = y
			}
			poss++
		}

		if poss == 1 {
			offset[i] = val
		} else {
			amb = append(amb, i)
		}
	}

	for _, i := range amb {
		r := ask(2, idxA1, i)
		if r > D {
			offset[i] = -D
		} else {
			offset[i] = D + 1
		}
	}

	minY := offset[1]
	for i := 2; i <= n; i++ {
		if offset[i] < minY {
			minY = offset[i]
		}
	}
	A := 1 - minY

	ans := make([]int, n+1)
	for i := 1; i <= n; i++ {
		ans[i] = A + offset[i]
	}
	answer(ans, n)
}

func main() {
	defer out.Flush()
	var t int
	fmt.Fscan(in, &t)
	for ; t > 0; t-- {
		var n int
		fmt.Fscan(in, &n)
		solveCase(n)
	}
}