← Home
 ```go
package main

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

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var t int
	fmt.Fscan(in, &t)
	for tc := 0; tc < t; tc++ {
		var n, m int
		fmt.Fscan(in, &n, &m)
		a := make([]int, n)
		for i := 0; i < n; i++ {
			fmt.Fscan(in, &a[i])
		}

		freq := make(map[int]int)
		for _, v := range a {
			freq[v]++
		}

		byFreq := make(map[int][]int)
		for v, c := range freq {
			byFreq[c] = append(byFreq[c], v)
		}

		bad := make(map[int]map[int]struct{})
		for i := 0; i < m; i++ {
			var x, y int
			fmt.Fscan(in, &x, &y)
			if _, ok := bad[x]; !ok {
				bad[x] = make(map[int]struct{})
			}
			bad[x][y] = struct{}{}
			if _, ok := bad[y]; !ok {
				bad[y] = make(map[int]struct{})
			}
			bad[y][x] = struct{}{}
		}

		for c := range byFreq {
			sort.Slice(byFreq[c], func(i, j int) bool {
				return byFreq[c][i] > byFreq[c][j]
			})
		}

		counts := make([]int, 0, len(byFreq))
		for c := range byFreq {
			counts = append(counts, c)
		}

		var ans int64 = 0

		for _, c := range counts {
			L := byFreq[c]
			if len(L) < 2 {
				continue
			}
			sumc := int64(c + c)
			for i, x := range L {
				bestPartner := L[0]
				if i == 0 {
					bestPartner = L[1]
				}
				if sumc*(int64(x)+int64(bestPartner)) <= ans {
					break
				}
				for j, y := range L {
					if i == j {
						continue
					}
					if inner, ok := bad[x]; ok {
						if _, isBad := inner[y]; isBad {
							continue
						}
					}
					val := sumc * int64(x+y)
					if val > ans {
						ans = val
					}
					break
				}
			}
		}

		for i := 0; i < len(counts); i++ {
			c1 := counts[i]
			L1 := byFreq[c1]
			for j := i + 1; j < len(counts); j++ {
				c2 := counts[j]
				L2 := byFreq[c2]

				if len(L1) > len(L2) {
					c1, c2 = c2, c1
					L1, L2 = L2, L1
				}

				sumc := int64(c1 + c2)
				for _, x := range L1 {
					if sumc*(int64(x)+int64(L2[0])) <= ans {
						break
					}
					for _, y := range L2 {
						if inner, ok := bad[x]; ok {
							if _, isBad := inner[y]; isBad {
								continue
							}
						}
						val := sumc * int64(x+y)
						if val > ans {
							ans = val
						}
						break
					}
				}
			}
		}

		fmt.Fprintln(out, ans)
	}
}
```