#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <queue> #include <algorithm> #include <vector> #include <cstring> #include <stack> #include <cctype> #include <utility> #include <map> #include <string> #include <climits> #include <set> #include <string> #include <sstream> #include <utility> #include <ctime> //#pragma comment(linker, "/STACK:1024000000,1024000000") using std::priority_queue; using std::vector; using std::swap; using std::stack; using std::sort; using std::max; using std::min; using std::pair; using std::map; using std::string; using std::cin; using std::cout; using std::set; using std::queue; using std::string; using std::istringstream; using std::getline; using std::make_pair; using std::greater; const int MAXN(30); const int MAXP(30); int Ava[MAXN]; int Max[MAXP][MAXN], All[MAXP][MAXN], Nee[MAXP][MAXN]; int tava[MAXN]; int tall[MAXP][MAXN], tnee[MAXP][MAXN]; int Req[MAXN]; bool finish[MAXP]; int n, p; bool is_legal(int num) { for(int i = 1; i <= n; ++i) if(tnee[num][i] > tava[i]) return false; return true; } bool dfs(int dep) { if(dep == p) return true; for(int i = 1; i <= p; ++i) if(!finish[i] && is_legal(i)) { finish[i] = true; for(int j = 1; j <= n; ++j) tava[j] += tall[i][j]; if(dfs(dep+1)) return true; for(int j = 1; j <= n; ++j) tava[j] -= tall[i][j]; finish[i] = false; } return false; } int main() { int num; while(~scanf("%d%d", &n, &p)) //资源数 进程数 { for(int i = 1; i <= p; ++i) for(int j = 1; j <= n; ++j) scanf("%d", Max[i]+j); for(int i = 1; i <= p; ++i) for(int j = 1; j <= n; ++j) scanf("%d", All[i]+j); for(int i = 1; i <= p; ++i) for(int j = 1; j <= n; ++j) scanf("%d", Nee[i]+j); for(int i = 1; i <= n; ++i) scanf("%d", Ava+i); while(~scanf("%d", &num)) { for(int i = 1; i <= n; ++i) scanf("%d", Req+i); bool flag = false; for(int i = 1; i <= n; ++i) if(Req[i] > Nee[num][i] || Req[i] > Ava[i]) { printf("申请非法\n"); flag = true; break; } if(flag) continue; memcpy(tava, Ava, sizeof(tava)); memcpy(tall, All, sizeof(tall)); memcpy(tnee, Nee, sizeof(tnee)); memset(finish, 0, sizeof(finish)); for(int i = 1; i <= n; ++i) { tava[i] -= Req[i]; tall[num][i] += Req[i]; tnee[num][i] -= Req[i]; } if(dfs(0)) { printf("安全分配\n"); for(int i = 1; i <= n; ++i) { Ava[i] -= Req[i]; All[num][i] += Req[i]; Nee[num][i] -= Req[i]; } } else printf("不安全分配\n"); } } }