#include #include #include #include #include #include #include #include #include #include #define CLR(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long LL; typedef pair pii; const int MAXN = 3 * 1e6 + 10; const int MOD = 9973; const int INF = 0x3f3f3f3f; struct Node { char var[20]; int digit, op; }; Node num[1010][40]; int cnt[1010]; void Solve(char *s, int id) { int top = 0; cnt[id] = 0; num[id][cnt[id]].op = 0; int len = strlen(s), mark = 0, sum = 0, sign = 1; s[len] = ','; for(int i = 0; i <= len; i++) { if(s[i] == ',') { num[id][cnt[id]].digit = sum * sign; cnt[id]++; top = mark = 0; num[id][cnt[id]].op = 0; sum = 0; sign = 1; } else if(s[i] == ' ') { if(s[i+1] != ' ') { if(mark == 1) { num[id][cnt[id]].var[top] = 0; } } } else if(s[i] == '>') { mark = 2; num[id][cnt[id]].op = 1; } else if(s[i] == '<') { mark = 2; num[id][cnt[id]].op = 2; } else if(s[i] == '=') { mark = 2; num[id][cnt[id]].op += 3; } else if(s[i] == '-' || (s[i] >= '0' && s[i] <= '9')) { mark = 3; if(s[i] == '-') { sign = -1; continue; } sum = sum * 10 + (s[i] - '0'); } else { mark = 1; num[id][cnt[id]].var[top++] = s[i]; } } } // > 1 < 2 = 3 >= 4 <= 5 == 6 bool Check(int op1, int v1, int op2, int v2) { if(op1 == 1) { if(op2 == 2 && v2 <= v1 + 1) { return false; } if(op2 == 5 || op2 == 6) { if(v2 <= v1) { return false; } } } if(op1 == 2) { if(op2 == 1 && v2 >= v1 + 1) { return false; } if(op2 == 4 || op2 == 6) { if(v2 >= v1) return false; } } if(op1 == 4) { if(op2 == 2 && v2 <= v1) { return false; } if(op2 == 5 || op2 == 6) { if(v2 < v1) { return false; } } } if(op1 == 5) { if(op2 == 1 && v2 >= v1) { return false; } if(op2 == 4 || op2 == 6) { if(v2 > v1) return false; } } if(op1 == 6) { if(op2 == 1 && v2 >= v1) { return false; } if(op2 == 2 && v2 <= v1) { return false; } if(op2 == 4 && v2 > v1) { return false; } if(op2 == 5 && v2 < v1) { return false; } if(op2 == 6 && v2 != v1) { return false; } } return true; } bool judge(int x, int y) { for(int i = 0; i < cnt[x]; i++) { for(int j = 0; j < cnt[y]; j++) { if(strcmp(num[x][i].var, num[y][j].var) == 0) { if(!Check(num[x][i].op, num[x][i].digit, num[y][j].op, num[y][j].digit)) { return false; } } } } return true; } char str[101000]; int rec[1010]; bool vis[1010]; int main() { int n; while(scanf("%d", &n) != EOF) { getchar(); for(int i = 1; i <= n; i++) { gets(str); Solve(str, i); // for(int j = 0; j < cnt[i]; j++) { // printf("%s %d %d\n", num[i][j].var, num[i][j].op, num[i][j].digit); // } vis[i] = judge(i, i); if(vis[i] == false) { printf("unique\n"); continue; } int m = 0; bool flag = false; for(int j = 1; j < i; j++) { if(vis[j] == false) continue; if(judge(i, j)) { rec[++m] = j; flag = true; } } if(!flag) { printf("unique\n"); } else { for(int j = 1; j <= m; j++) { if(j > 1) printf(" "); printf("%d", rec[j]); } printf("\n"); } } } return 0; }