1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
using namespace std;
typedef vector<unsigned int> vi;
const int MX=200050,md=1000000007;
int n,m,x[2*MX],y[2*MX];
set<vi> q,was;
int getbit(vi& v, int j) {
  return (v[j/32]>>(j&31))&1;
}
void xorbit(vi& v, int j) {
  v[j/32]^=(1U<<(j&31));
}
int main() {
  scanf("%d%d",&n,&m);
  int len=(n-1)/32+1;
  vi v(len);
  for (int i=0; i<n; i++) {
    int x;
    scanf("%d",&x);
    if (x) xorbit(v,i);
  }
  for (int i=0; i<m; i++) {
    scanf("%d%d",&x[i],&y[i]);
    --x[i];
    --y[i];
  }
  q.insert(v);
  while (!q.empty()) {
    auto qt=q.begin();
    v=*qt;
    q.erase(qt);
    for (int j=0; j<m; j++) {
      int bx=getbit(v,x[j]);
      int by=getbit(v,y[j]);
      if (bx==by) {
        xorbit(v,x[j]);
        xorbit(v,y[j]);
        auto it=was.find(v);
        if (it==was.end()) {
          it=q.find(v);
          if (it==q.end()) q.insert(v);
        }
        xorbit(v,x[j]);
        xorbit(v,y[j]);
      }
    }
    was.insert(v);
    v.clear();
  }
  printf("%d\n",int(was.size())%md);
  return 0;
}