注意判一下欧拉回路的情况,这种情况下需要找一个点再异或一次
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
const int maxm = 1e6 + 10;
int T, n, m, a[maxn];
int mem, head[maxn];
struct Edge { int to, next; }edges[maxm];
void init_edges() {
mem = 0;
for (int i = 0; i <= n; i++) head[i] = -1;
}
void addedge(int u, int v) {
edges[mem].to = v; edges[mem].next = head[u]; head[u] = mem++;
}
char c;
inline void input(int &x) {
x = 0;
while ((c = getchar()) < '0' || c > '9');
while ('0' <= c && c <= '9') x = x * 10 + (c - '0'), c = getchar();
}
int degree[maxn];
bool vis[maxn];
void dfs(int u) {
vis[u] = 1;
for (int i = head[u]; ~i; i = edges[i].next) {
int v = edges[i].to;
if (!vis[v]) dfs(v);
}
}
int main() {
input(T);
while (T--) {
input(n); input(m);
init_edges();
for (int i = 0; i <= n; i++) degree[i] = 0;
for (int i = 1; i <= n; i++) input(a[i]);
int u, v;
for (int i = 1; i <= m; i++) {
input(u); input(v);
addedge(u, v); addedge(v, u);
degree[u]++; degree[v]++;
}
int cnt = 0;
for (int i = 0; i <= n; i++) vis[i] = 0;
for (int i = 1; i <= n; i++) if (!vis[i]) { dfs(i); cnt++; }
int cnt_ = 0;
for (int i = 1; i <= n; i++) if (degree[i] % 2) cnt_++;
if (cnt > 1 || (cnt_ != 0 && cnt_ != 2)) puts("Impossible");
else {
int ans = 0;
for (int i = 1; i <= n; i++) {
if (degree[i] % 2 == 0) ans ^= (degree[i]/2)%2*a[i];
else ans ^= (degree[i]/2+1)%2*a[i];
}
int temp = ans;
if (cnt_ == 0) {
for (int i = 1; i <= n; i++) ans = max(ans, temp ^ a[i]);
}
printf("%d\n", ans);
}
}
return 0;
}