/**
 * 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;
}