//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m;
int l[N]; // l[i]表示计算节点i在可用区l[i]中
int cnt[N]; // 表示计算节点运行的任务数量
unordered_map<int, vector<int>> app; // app[a] = {2, 3}表示应用a占用节点2,3
bool paa_st[N]; // paa_st[i]表示第i个计算节点上是否有paa应用
bool pa_st[N]; // pa[i]表示第i个计算节点上是否有pa应用
int find(int na, int pa, int paa, int paar) {
// 过滤阶段
// 过滤出所有满足要求的点
// na == 0则不用过滤 na > 0则计算节点需要满足 l[i] == na
// pa == 0不用过滤 pa > 0表示必须和编号为pa的应用在同一个可用区运行
// paa == 0则不用过滤 paa > 0计算任务反亲和性 表示任务不能和应用编号为paa的任务在同一个计算节点上运行
// paar == 0表示尽量满足 paar == 1表示必须满足
memset(paa_st, false, sizeof paa_st);
memset(pa_st, false, sizeof pa_st);
if(paa) {
for(auto x : app[paa]) {
paa_st[x] = true; // 表示x节点上有运行paa应用
}
}
if(pa) {
for(auto x : app[pa]) {
pa_st[l[x]] = true;
}
}
// 排序阶段
// 选择此时任务数量最少的结点
// 选择此时编号最小的结点
int ret = -1, c = 0x3f3f3f3f;
for(int i = 1; i <= n; i++) {
if(cnt[i] < c && (na == 0 || l[i] == na) && (paa == 0 || paa_st[i] == false) && (pa == 0 || pa_st[l[i]])) {
ret = i;
c = cnt[i];
}
}
if(paar == 0) {
if(ret == -1) {
for(int i = 1; i <= n; i++) {
if(cnt[i] < c && (na == 0 || l[i] == na) && (pa == 0 || pa_st[l[i]])) {
ret = i;
c = cnt[i];
}
}
}
}
return ret;
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &l[i]);
int g;
scanf("%d", &g);
while(g--) {
int f, a, na, pa, paa, paar;
scanf("%d%d%d%d%d%d", &f, &a, &na, &pa, &paa, &paar);
vector<int> ans;
for(int i = 0; i < f; i++) {
int x = find(na, pa, paa, paar); // 找到符合条件的计算节点编号
if(x == -1) ans.push_back(0);
else {
ans.push_back(x);
cnt[x]++; // 计算节点x的任务数+1
app[a].push_back(x); // 应用a需要占用x计算节点
}
}
for(auto x : ans) {
printf("%d ", x);
}
cout << '\n';
}
return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~