#include <iostream> #include<vector> #include<algorithm> using namespace std; //未处理0,可能轻-1,可能重2,真1 //=说明两边都是真;不等号说明假在两边,其他真;同一硬币两次判断相反说明真。 //只对未测和非真进行统计,数目为一则输出结果,否则输出零。 vector<int>weight; int n; void deal() { int a; cin >> a; vector<int>left(a), right(a); for (int j = 0; j < a; j++) { cin >> left[j]; } for (int j = 0; j < a; j++) { cin >> right[j]; } char op; cin >> op; if(op=='='){ for(int w:left){ weight[w]=1; } for(int w:right){ weight[w]=1; } } else if(op=='<'){ for(int w:left){ if(weight[w]==0) weight[w]=-1; else if(weight[w]==2) weight[w]=1; } for(int w:right){ if(weight[w]==0) weight[w]=2; else if(weight[w]==-1) weight[w]=1; } for(int i=1;i<=n;i++){//出现不等号说明其他硬币都是真的 if(find(left.begin(),left.end(),i)==left.end()&&find(right.begin(),right.end(),i)==right.end()){ weight[i]=1; } } } else if(op=='>'){ for(int w:left){ if(weight[w]==0) weight[w]=2; else if(weight[w]==-1) weight[w]=1; } for(int w:right){ if(weight[w]==0) weight[w]=-1; else if(weight[w]==2) weight[w]=1; } for(int i=1;i<=n;i++){ if(find(left.begin(),left.end(),i)==left.end()&&find(right.begin(),right.end(),i)==right.end()){ weight[i]=1; } } } } int main() { int k; while (cin >> n >> k) { // 注意 while 处理多个 case weight=vector<int>(n+1,0); for (int i = 0; i < k; i++) { deal(); } vector<int>res(4,0); int f; for(int i=1;i<=n;i++){ res[weight[i]+1]++; if(weight[i]!=1){ f=i; } } if(res[2]!=n-1){ cout<<0<<endl; } else{ cout<<f<<endl; } } } // 64 位输出请用 printf("%lld")