```go
package main
import (
"bufio"
"fmt"
"os"
)
func solve() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
fmt.Fscan(reader, &t)
for i := 0; i < t; i++ {
var n int
fmt.Fscan(reader, &n)
p := make([]int, n+1)
M := []int{}
for j := 1; j <= n; j++ {
fmt.Fscan(reader, &p[j])
if p[j] != j {
M = append(M, j)
}
}
if len(M) == 0 {
ans := int64(2*n) * int64(2*n+1) / 2
fmt.Fprintln(writer, ans)
continue
}
L_max := 2 * n
R_min := 1
for _, x := range M {
min_p := 1
if x == 1 {
min_p = 2
}
max_p := n
if x == n {
max_p = n - 1
}
if x+max_p < L_max {
L_max = x + max_p
}
if x+min_p > R_min {
R_min = x + min_p
}
}
ans := int64(0)
for r := R_min; r <= 2*n; r++ {
limit := L_max
if r-1 < limit {
limit = r - 1
}
if limit >= 1 {
ans += int64(limit)
}
}
isValid := true
sum := -1
for _, x := range M {
if sum == -1 {
sum = x + p[x]
} else if x+p[x] != sum {
isValid = false
break
}
if p[p[x]] != x {
isValid = false
break
}
}
if isValid && sum != -1 {
ans++
}
fmt.Fprintln(writer, ans)
}
}
func main() {
solve()
}
```