#include #include using namespace std; typedef long long LL; const int N = 310, M = 340, MOD = 1000000007; int n, m, x; int a[N]; bitset mat[M]; int main() { scanf("%d%d%d", &n, &m, &x); for (int i = 0; i < n; ++i) scanf("%d", &a[i]); for (int k = 0; k < 30; ++k) { for (int i = 0; i < n; ++i) { if ((a[i] >> k) & 1) mat[k][i] = 1; } mat[k][n] = (x >> k) & 1; } for (int j = 0; j < m; ++j) { int type, l, r; scanf("%d%d%d", &type, &l, &r); for (int i = l - 1; i < r; ++i) { mat[30 + j][i] = 1; } mat[30 + j][n] = type; } int rank = 0; for (int col = 0; col < n; ++col) { int pivot = -1; for (int row = rank; row < m + 30; ++row) { if (mat[row][col]) { pivot = row; break; } } if (pivot == -1) continue; swap(mat[rank], mat[pivot]); for (int row = 0; row < m + 30; ++row) { if (row != rank && mat[row][col]) { mat[row] ^= mat[rank]; } } rank++; } for (int row = rank; row < m + 30; ++row) { bool all_zero = true; for (int col = 0; col < n; ++col) { if (mat[row][col]) { all_zero = false; break; } } if (all_zero && mat[row][n]) { printf("0\n"); return 0; } } LL ans = 1; for (int i = 0; i < n - rank; ++i) { ans = ans * 2 % MOD; } printf("%lld\n", ans); return 0; }