#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define f(i, a, n) for (int i = (a); i <= (n); i++)
#define ff first
#define ss second
#define UWU ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }

template <typename T, typename V>
void __print(const pair<T, V> &x)
{
    cerr << '{';
    __print(x.first);
    cerr << ',';
    __print(x.second);
    cerr << '}';
}
template <typename T>
void __print(const T &x)
{
    int f = 0;
    cerr << '{';
    for (auto &i : x)
        cerr << (f++ ? "," : ""), __print(i);
    cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v)
{
    __print(t);
    if (sizeof...(v))
        cerr << ", ";
    _print(v...);
}
#ifndef ONLINE_JUDGE
#define debug(x...)               \
    cerr << "[" << #x << "] = ["; \
    _print(x)
#else
#define debug(x...)
#endif

const ll N = 1e5 + 5, mod = 998244353, p1 = 31, mod2 = 1e9 + 9, p2 = 37, M = 9e6 + 5;

void solve()
{
    ll n, q;
    cin >> n >> q;
    vector<ll> a(n);
    char c;
    ll len = sqrt(n) + 1;
    vector<vector<ll>> b(len);
    for (ll i = 0; i < n; i++)
    {
        cin >> c;
        a[i] = c - 'a';
        b[i / len].push_back(a[i]);
    }
    vector<ll> lazy(len, 0), valid(len, 0);
    auto updateLazy = [&](ll i)
    {
        for (ll j = 0; j < b[i].size(); j++)
        {
            b[i][j] += lazy[i];
            b[i][j] %= 26;
        }
        lazy[i] = 0;
    };
    auto updateValidity = [&](ll i)
    {
        updateLazy(i);
        if (b[i].size() < 2)
            return;
        bool f = 0;
        for (ll j = 1; j < b[i].size(); j++)
        {
            if (b[i][j] == b[i][j - 1])
                f = 1;
            if (j > 1)
                if (b[i][j] == b[i][j - 2])
                    f = 1;
        }
        valid[i] = f;
    };

    auto updatePos = [&](ll i, ll block, ll x)
    {
        b[block][i] += x;
        b[block][i] %= 26;
    };
    auto check = [&](ll b1, ll b2)
    {
        ll p1 = b1 / len;
        ll p2 = b2 / len;
        ll n1 = (b[p1][b1 % len] + lazy[p1]) % 26;
        ll n2 = (b[p2][b2 % len] + lazy[p2]) % 26;
        return (n1 == n2);
    };
    for (ll i = 0; i < len; i++)
        updateValidity(i);
    ll op, l, r, x;

    while (q--)
    {
        cin >> op >> l >> r;
        l--, r--;
        if (op == 1)
        {
            cin >> x;
            for (ll i = l; i <= r;)
            {
                ll block = i / len;
                if ((i % len == 0) && (i + len - 1 <= r))
                {
                    lazy[block] += x;
                    i += len;
                }
                else
                {
                    updatePos(i % len, i / len, x);
                    i++;
                }
            }
            updateValidity(l / len);
            updateValidity(r / len);
        }
        else
        {
            bool t = 0;
            for (ll i = l; i <= r;)
            {
                ll block = i / len;
                if ((i % len == 0) && (i + len - 1 <= r))
                {
                    if (valid[block])
                        t |= 1;
                    i += len;
                }
                else
                {
                    i++;
                }
            }
            for (ll i = l; i <= r;)
            {
                ll block = i / len;
                if ((i % len == 0) && (i + len - 1 <= r))
                {
                    if (i + 1 <= r)
                        t |= check(i, i + 1);
                    if (i + 2 <= r)
                        t |= check(i, i + 2);
                    if (i - 1 >= l)
                        t |= check(i, i - 1);
                    if (i - 2 >= l)
                        t |= check(i, i - 2);
                    i += len;
                }
                else
                {
                    if (i + 1 <= r)
                        t |= check(i, i + 1);
                    if (i + 2 <= r)
                        t |= check(i, i + 2);
                    if (i - 1 >= l)
                        t |= check(i, i - 1);
                    if (i - 2 >= l)
                        t |= check(i, i - 2);
                    i++;
                }
            }
            if (t)
                cout
                    << "NO\n";
            else
                cout << "YES\n";
        }
    }
}
int main()
{
    UWU;
    int tc = 1;
    cin >> tc;
    cout << fixed << setprecision(30);
    while (tc--)
    {

        solve();
    }
}
/*

*/