n, m = map(int, input().split()) # 计算节点的数目 可用区的数目
l_i = list(map(int, input().split())) # 计算节点位于编号
dic_0 = {} # 存放每个区的可用节点编号
dic_1 = {} # 存放节点的应用信息
list_p = [0 for i in range(n + 1)] # 节点利用次数
for i in range(1, m+1):
dic_0[i] = []#区域没有可用结点
for i in range(1,n+1):
dic_1[i] = [] # 存放应用编号
dic_0[l_i[i-1]].append(i)
dic_0[0] = [i for i in range(1,n+1)]
def search_node(node_s, pai, paa_i):
if node_s.count(pai) != 0:
return 0
g = int(input()) # 任务的组数
g_1 = []
for i in range(g):
g_i = list(map(int, input().split()))
fi, ai, nai, pai, paa_i, paar_i = g_i
# 任务数、应用编号、nai的可用区内1,与应用编号一起2、与应用编号不一起3,必须满足/
g_2 = []
for j in range(fi):
p1 = len(dic_0[nai]) # 符合条件1的节点数量
p2 = [] # 符合条件的节点
p3 = [] # 符合条件的节点 去除反亲和性
if p1 > 0: # 该可用区有计算节点,且计算节点就是dic_0[nai]
for k in range(p1):
node_num = dic_0[nai][k] #节点编号 dic_1[node_num]是[]包含应用信息
if pai == 0:#没有亲和要求
if paa_i == 0:#没有反亲和
p2.append([node_num, len(dic_1[node_num])])#[结点编号,结点应用数目]
elif dic_1[node_num].count(paa_i) == 0: # 满足反亲和性要求 应用里没有paai
p2.append([node_num,len(dic_1[node_num])]) #添加节点编号及其任务数量
elif paar_i == 0 and dic_1[node_num].count(paa_i) != 0:#必须满足反亲和
p3.append([node_num,len(dic_1[node_num])])
elif dic_1[node_num].count(pai) != 0: #有亲和要求 且满足了
if paa_i == 0:#没有反亲和
p2.append([node_num, len(dic_1[node_num])])
#有反亲和
elif dic_1[node_num].count(paa_i) == 0: # 满足反亲和性要求
p2.append([node_num, len(dic_1[node_num])])
#不满足反亲和要求
elif paar_i == 0 and dic_1[node_num].count(paa_i) != 0:#尽量满足
p3.append([node_num, len(dic_1[node_num])])
if len(p2) != 0:#有符合三个条件的结点
p2.sort(key=lambda x : (x[1],x[0]))#先按照结点数据 再按照结点编号进行排序
g_2.append(p2[0][0])#结点编号
list_p[p2[0][0]] += 1#该结点 次数+1
dic_1[p2[0][0]].append(ai)#更新该节点的应用
elif len(p3) != 0:#没有符合的 但有去除反亲核性的
p3.sort(key=lambda x: (x[1], x[0]))
g_2.append(p3[0][0])
list_p[p3[0][0]] += 1
dic_1[p3[0][0]].append(ai)
else:#都没有
g_2.append(0)
g_1.append(g_2)
for i in range(g):
for j in g_1[i]:
print(j,end = ' ')
print()