原题链接:nyoj93 汉诺塔(三)
//思路:用三个栈储存盘子编号,对三个栈操作,
//若第要取的栈空或者取出的编号大于要放的栈中的编号为不合法
#include <cstdio>
#include <stack>
using namespace std;
int P, Q;
stack<int > sta1, sta2, sta3;
void init(){
while(!sta1.empty()) sta1.pop();
while(!sta2.empty()) sta2.pop();
while(!sta3.empty()) sta3.pop();
for(int i = P;i > 0;i --) sta1.push(i);
}
bool han(int a, int b){
int t;
switch(a){
case 1: if(!sta1.empty()) {t = sta1.top(); sta1.pop();}
else return false;
break;
case 2: if(!sta2.empty()) {t = sta2.top(); sta2.pop();}
else return false;
break;
case 3: if(!sta3.empty()) {t = sta3.top(); sta3.pop();}
else return false;
break;
}
switch(b){
case 1: if(sta1.empty() || t < sta1.top()) sta1.push(t);
else return false;
break;
case 2: if(sta2.empty() || t < sta2.top()) sta2.push(t);
else return false;
break;
case 3: if(sta3.empty() || t < sta3.top()) sta3.push(t);
else return false;
break;
}
return true;
}
int main(){
int N;
int a, b;
scanf("%d", &N);
while(N --){
scanf("%d%d", &P, &Q);
init();
int flag = 1;
for(int i = 0;i < Q;i ++){
scanf("%d%d", &a, &b);
if(flag && !han(a, b)){
flag = 0;
}
}
if(flag)
printf("legal\n");
else
printf("illegal\n");
}
return 0;
}