#include using namespace std; using uint = unsigned int; using ll = long long; using ull = unsigned long long; constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); } template using V = vector; template using VV = V>; struct BitVec { size_t n; V d; explicit BitVec(size_t _n = 0) : n(_n), d((n + 63) / 64) {} size_t size() const { return n; } bool operator[](size_t i) const { return bool((d[i / 64] >> (i % 64)) & 1); } void set(size_t i, bool f) { if (f) d[i / 64] |= (1ULL << (i % 64)); else d[i / 64] &= ~(1ULL << (i % 64)); } void reset() { fill(d.begin(), d.end(), 0); } void push_back(bool f) { if (n % 64 == 0) d.push_back(0); set(n, f); n++; } void swap_elms(size_t a, size_t b) { bool f = (*this)[a]; set(a, (*this)[b]); set(b, f); } template BitVec& op1(OP op) { for (auto& x: d) x = op(x); return *this; } template BitVec& op2(const BitVec& r, OP op) { assert(n == r.n); for (size_t i = 0; i < d.size(); i++) d[i] = op(d[i], r.d[i]); return *this; } BitVec& operator&=(const BitVec& r) { return op2(r, bit_and()); } BitVec& operator|=(const BitVec& r) { return op2(r, bit_or()); } BitVec& operator^=(const BitVec& r) { return op2(r, bit_xor()); } BitVec& operator<<=(const size_t& s) { ptrdiff_t block = s / 64, rem = s % 64; if (d.size() <= block) { reset(); return *this; } for (ptrdiff_t i = d.size() - 1; i >= block; i--) { if (rem == 0) d[i] = d[i - block]; else { ull u = (d[i - block] << rem); if (i > block) u |= (d[i - block - 1]) >> (64 - rem); d[i] = u; } } fill(d.begin(), d.begin() + block, 0); return *this; } BitVec& operator>>=(const size_t& s) { size_t block = s / 64, rem = s % 64; for (size_t i = 0; i < d.size() - block; i++) { if (rem == 0) d[i] = d[i + block]; else { ull u = (d[i + block] << rem); if (i + block + 1 < d.size()) u |= (d[i + block + 1]) >> (64 - rem); d[i] = u; } } for (size_t i = d.size() - block; i < d.size(); i++) d[i] = 0; return *this; } BitVec operator&(const BitVec& r) const { return BitVec(*this) &= r; } BitVec operator|(const BitVec& r) const { return BitVec(*this) |= r; } BitVec operator^(const BitVec& r) const { return BitVec(*this) ^= r; } BitVec operator<<(const size_t& s) const { return BitVec(*this) <<= s; } BitVec operator>>(const size_t& s) const { return BitVec(*this) >>= s; } }; int main() { int n; scanf("%d", &n); VV g(100000); for (int i = 0; i < n; i++) { int a; scanf("%d", &a); g[a].push_back(i); } BitVec mp(2*n - 1); for (int i = 0; i < n; i++) { int x; scanf("%d", &x); if (x == 1) { mp.set(i, true); } } BitVec ans(2*n - 1); for (int i = 0; i < 100000; i++) { BitVec res(2*n - 1); for (int d: g[i]) { res |= mp << d; } ans ^= res; } for (int i = 0; i < 2*n-1; i++) { if (ans[i]) { printf("ODD\n"); } else { printf("EVEN\n"); } } return 0; }