package main
import (
"bufio"
"fmt"
"os"
"sort"
)
type Count struct {
pos int // 通道位置(行间或列间)
count int // 隔开的说话对数量
}
func main() {
reader := bufio.NewReader(os.Stdin)
var n, m, k, l, d int
fmt.Fscanf(reader, "%d %d %d %d %d\n", &n, &m, &k, &l, &d)
// 记录相邻行之间、相邻列之间的说话对数量
rowGap := make([]int, n) // rowGap[i] 表示第 i 行和第 i+1 行之间的说话对数(i 从 0 到 n-2)
colGap := make([]int, m) // colGap[j] 表示第 j 列和第 j+1 列之间的说话对数(j 从 0 到 m-2)
for i := 0; i < d; i++ {
var x, y, p, q int
fmt.Fscanf(reader, "%d %d %d %d\n", &x, &y, &p, &q)
// 统一为 0-indexed
x--
y--
p--
q--
// 判断是否是上下相邻(同一列,行差1)
if y == q {
// 上下相邻,位于同一列
rowGap[min(x, p)]++
} else {
// 左右相邻,位于同一行
colGap[min(y, q)]++
}
}
// 构建结构体用于排序
var rowPairs, colPairs []Count
for i := 0; i < n-1; i++ {
if rowGap[i] > 0 {
rowPairs = append(rowPairs, Count{i, rowGap[i]})
}
}
for j := 0; j < m-1; j++ {
if colGap[j] > 0 {
colPairs = append(colPairs, Count{j, colGap[j]})
}
}
// 降序排序
sort.Slice(rowPairs, func(i, j int) bool {
return rowPairs[i].count > rowPairs[j].count
})
sort.Slice(colPairs, func(i, j int) bool {
return colPairs[i].count > colPairs[j].count
})
// 选择前 k 个行间通道位置(输出的是第 i+1 条通道在第 i+1 行之后)
var hChannels []int
for i := 0; i < k && i < len(rowPairs); i++ {
hChannels = append(hChannels, rowPairs[i].pos+1) // 输出 1-indexed 行号
}
// 选择前 l 个列间通道位置
var vChannels []int
for i := 0; i < l && i < len(colPairs); i++ {
vChannels = append(vChannels, colPairs[i].pos+1) // 输出 1-indexed 列号
}
// 递增排序
sort.Slice(hChannels, func(i, j int) bool {
return hChannels[i] < hChannels[j]
})
sort.Slice(vChannels, func(i, j int) bool {
return vChannels[i] < vChannels[j]
})
// 输出横向通道(行间)
for i := 0; i < len(hChannels); i++ {
if i > 0 {
fmt.Print(" ")
}
fmt.Print(hChannels[i])
}
fmt.Println()
// 输出纵向通道(列间)
for i := 0; i < len(vChannels); i++ {
if i > 0 {
fmt.Print(" ")
}
fmt.Print(vChannels[i])
}
fmt.Println()
}
func min(a, b int) int {
if a < b {
return a
}
return b
}