//202203-3 计算资源调度器
//一个计算节点可以进行多个计算任务
struct Node
{
int i,na,cnt;//顶点编号,所属计算区域,计算任务数量
set<int> app;//存储计算任务所属的应用编号
};
bool cmp(Node a,Node b)
{
if(a.cnt==b.cnt) return a.i<b.i;//节点按编号排序
else return a.cnt<b.cnt;
}
vector<Node> v;
unordered_map<int,set<int>> M;//把区域的编号和应用编号联系起来
unordered_map<int,vector<Node>> qv;//把区域编号和节点存储联系
int n,m,g;
int f,ai,na,pa,paa,paar;
int t;
void update(int a,int q,int ap)
{
M[v[a].na].insert(ap);
v[a].cnt++;
v[a].app.insert(ap);
};
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
Node temp={i,t};
qv[t].push_back(temp);//区域加入节点
v.push_back(temp);
}
sort(v.begin(),v.end(),cmp);//节点排序编号和任务数目
scanf("%d",&g);
while(g--)
{
scanf("%d%d%d%d%d%d",&f,&ai,&na,&pa,&paa,&paar);
while(f--)
{
bool panduan=0;
if(na)//判断是否有区间编号要求
{
if(pa)//判断是否要和编号为pa编号应用的任务在同一可行区域执行
{
if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
{
if(qv[na].empty()||!M[na].count(pa))
{
printf("0 ");
continue;
}
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(v[i].na!=na) continue;
if(v[i].app.count(paa)) continue;
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
if(!panduan&&paar==0) goto index;
else if(!panduan) printf("0 ");
}
else//尽量满足
{
index:
if(qv[na].empty()||!M[na].count(pa))
{
printf("0 ");
continue;
}
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(v[i].na!=na) continue;
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
}
}
else
{
if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
{
if(qv[na].empty())
{
printf("0 ");
continue;
}
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(v[i].na!=na) continue;
if(v[i].app.count(paa)) continue;
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
if(!panduan&&paar==0) goto index1;
else if(!panduan)printf("0 ");
}
else//尽量满足
{
index1:
if(qv[na].empty())
{
printf("0 ");
continue;
}
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(v[i].na!=na) continue;
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
}
}
}
else//没有区间编号要求
{
if(pa)//判断是否要和编号为pa编号应用的任务在同一可行区域执行
{
if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
{
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(!M[v[i].na].count(pa)) continue;
if(v[i].app.count(paa)) continue;
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
if(!panduan&&paar==0) goto index2;
else if(!panduan) printf("0 ");
}
else//尽量满足
{
index2:
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(!M[v[i].na].count(pa)) continue;
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
if(!panduan) printf("0 ");
}
}
else
{
if(paa)//判断是否不能和编号为paa应用的计算任务在同一节点上执行,且必须满足
{
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(v[i].app.count(paa)) continue;
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
if(!panduan&&paar==0) goto index3;
else if(!panduan)printf("0 ");
}
else//尽量满足
{
index3:
int tt=n,min=999999,idex=0;
for(int i=0;i<v.size();i++)//找执行任务数量最少,编号最小
{
if(v[i].cnt==min)
{
if(v[i].i<tt) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
else if(v[i].cnt<min) tt=v[i].i,panduan=1,min=v[i].cnt,idex=i;
}
if(panduan)
{
printf("%d ",tt);
update(idex,na,ai);
continue;
}
}
}
}
}
printf("\n");
}
return 0;
}
12-23
1881
06-08
530
09-12
326
02-15
3706
09-23
5702
06-11
171
06-09
396
04-27
1020