#include using namespace std; const int N = 310, M = 300; struct Limit { int op, l, r; }; int n, m, x, a[N], ans; Limit limits[M]; int main() { // freopen("xor.in", "r", stdin); // freopen("xor.out", "w", stdout); scanf("%d%d%d", &n, &m, &x); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= m; ++i) { scanf("%d%d%d", &limits[i].op, &limits[i].l, &limits[i].r); } for (int i = 0; i < 1 << n; ++i) { int cnt = 0; for (int j = 0; j < n; ++j) { if (i & (1 << j)) { cnt ^= a[j + 1]; } } if (cnt != x) continue; bool ok = true; for (int j = 1; j <= m; ++j) { cnt = 0; for (int k = limits[j].l - 1; k <= limits[j].r - 1; ++k) { if (i & (1 << k)) ++cnt; } if (limits[j].op == 0) { if (cnt % 2 != 0) { ok = false; break; } } else { if (cnt % 2 == 0) { ok = false; break; } } } if (ok) ++ans; } printf("%d\n", ans); return 0; }