#include using namespace std; using LL = long long; using ULL = unsigned long long; #define rep(i,n) for(int i=0; i<(n); i++) struct dsu { vector V; dsu(int n) { V.resize(n); rep(i, n) V[i] = i; } int root(int a) { if (V[a] == a) return a; return V[a] = root(V[a]); } void merge(int r, int s) { V[root(s)] = root(r); } }; struct RangeProc { vector> G; vector X; void proc() { int N = G.size(); dsu Q(N * 2); rep(u, N) for (int v : G[u]) { Q.merge(u, v); } X.resize(N); rep(i, N) X[i] = Q.root(i); } }; int main() { int N, Q; cin >> N >> Q; vector A(N); rep(i, N) cin >> A[i]; rep(i, N) if (i % 2 == 1) A[i] = -A[i]; A.push_back(0); for (int i = N - 1; i >= 0; i--) A[i + 1] -= A[i]; RangeProc G; G.G.resize(N + 1); rep(i, Q) { int l, r; cin >> l >> r; l--; G.G[l].push_back(r); G.G[r].push_back(l); } G.proc(); vector S(N + 1); rep(i, N + 1) S[G.X[i]] += A[i]; bool ok = true; rep(i, N) if (S[i] != 0) ok = false; cout << (ok ? "YES" : "NO") << endl; return 0; }