/**
* Author: Sergey Kopeliovich (Burunduk30@gmail.com)
*/
#include <bits/stdc++.h>
using namespace std;
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
const int K = 100;
const int N = 1e5 + K;
int n, q, a[N];
template <const int max_size>
struct hashTable {
int cc, u[max_size];
int hash[max_size];
hashTable() : cc(1) { }
void clear() { cc++; }
int position( unsigned H ) const {
int i = H % max_size;
while (u[i] == cc && hash[i] != H)
if (++i == max_size)
i = 0;
return i;
}
bool count( int H ) const {
return u[position(H)] == cc;
}
bool insert( int H ) {
int i = position(H);
if (u[i] == cc)
return 0;
u[i] = cc, hash[i] = H;
return 1;
}
};
struct T {
int i, add_all, is_build;
hashTable<2 * K> s;
void build() {
s.clear();
forn(j, K)
s.insert(a[i + j] += add_all);
is_build = 1, add_all = 0;
}
bool get( int x ) {
if (!is_build)
build();
return s.count(x - add_all);
}
};
T t[N / K + 1];
inline int readChar();
int readInt();
int main() {
#define NAME "fabro"
assert(freopen(NAME ".in", "r", stdin));
assert(freopen(NAME ".out", "w", stdout));
n = readInt();
q = readInt();
forn(i, n)
a[i] = readInt();
for (int i = 0; i < n; i += K)
t[i / K].i = i;
while (q--) {
char type = readChar();
int l = readInt() - 1;
int r = readInt();
int x = readInt();
int l_i = (l + K - 1) / K - 1, r_i = r / K;
const int L = (l_i + 1) * K, R = r_i * K;
if (type == '?') {
bool res = 0;
while (l < r && l < L)
res |= (a[l++] == x - t[l_i].add_all);
while (l < r && r > R)
res |= (a[--r] == x - t[r_i].add_all);
for (l_i++; l_i < r_i && !res; l_i++)
res |= t[l_i].get(x);
puts(res ? "YES" : "NO");
} else {
if (l < L) {
while (l < r && l < L)
a[l++] += x;
t[l_i].is_build = 0;
}
if (r > R) {
while (l < r && r > R)
a[--r] += x;
t[r_i].is_build = 0;
}
for (l_i++; l_i < r_i; l_i++)
t[l_i].add_all += x;
}
}
return 0;
}
static const int buf_size = 4096;
inline int getchar_fast() { // you may use getchar() instead of it
static char buf[buf_size];
static int len = 0, pos = 0;
if (pos == len)
pos = 0, len = fread(buf, 1, buf_size, stdin);
if (pos == len)
return -1;
return buf[pos++];
}
inline int readChar() {
int c = getchar_fast();
while (c <= 32)
c = getchar_fast();
return c;
}
inline int readInt() {
int x = 0, s = 1, c = readChar();
if (c == '-')
s = -1, c = getchar_fast();
while ('0' <= c && c <= '9')
x = x * 10 + c - '0', c = getchar_fast();
return s == 1 ? x : -x;
}