#include #include #include #include #include #include #include #include #include #include using namespace std; int n, s[1001][40], status[1001], cnt = 0; char val[3][40]; string data; int l[1001][40], r[1001][40]; map mmap; #define inf 11111 void judge(int pre) { vector ans; int i, j; for (j = 1; j < pre; ++j) { if (status[j] == 1) continue; for (i = 0; i < cnt; ++i) if (s[j][i]*s[pre][i] == 1 && (l[j][i] > r[pre][i] || r[j][i] < l[pre][i])) break; if (i == cnt) ans.push_back(j); } if (ans.size() == 0) printf("unique\n"); else { for (j = 0; j < ans.size()-1; ++j) printf("%d ", ans[j]); printf("%d\n", ans[j]); } } int main() { cin >> n; char c = getchar(); memset(s, 0, sizeof s); memset(status, 0, sizeof status); for (int i = 1; i <= n; ++i) { int type = -1, size = 0, cur = 0; // name, op, value; length getline(cin, data); data.append("\n"); while (true) { c = data[cur++]; if (status[i] == 1) { if (c == '\n') { printf("unique\n"); break; } continue; } if (c == ',' || c == '\n') { val[type][size] = '\0'; type = -1; size = 0; string str(val[0]); if (mmap.count(str) == 0) mmap[str] = cnt++; int idx = mmap[str], value = atoi(val[2]); if (s[i][idx] == 0) { l[i][idx] = -inf; r[i][idx] = inf; s[i][idx] = 1; } if (strlen(val[1]) == 1) value = (val[1][0] == '>'?1 : -1) + value; if (val[1][0] == '>') { if (r[i][idx] < value) status[i] = 1; else if (value > l[i][idx]) l[i][idx] = value; } else if (val[1][0] == '<') { if (l[i][idx] > value) status[i] = 1; else if (value < r[i][idx]) r[i][idx] = value; } else { if (value >= l[i][idx] && value <= r[i][idx]) l[i][idx] = r[i][idx] = value; else status[i] = 1; } } else if (c == '>' || c == '<' || c == '=') { if (type == 0) { val[type][size] = '\0'; type++; size = 0; } val[1][size++] = c; } else if (c >= 'a' && c <= 'z') { if (type == -1) { type++; size = 0; } val[0][size++] = c; } else if ((c >= '0' && c <= '9') || c == '-') { if (type == 1) { val[type][size] = '\0'; type++; size = 0; } val[2][size++] = c; } if (c == '\n') { judge(i); break; } } } }