#include<bits/stdc++.h>
using namespace std;

using ll = long long;
using ull = unsigned long long;
using pii = pair<ull, ull>;

template<typename X, typename Y>
bool chmax(X& a, Y b) { return (a < b) ? a = b, 1 : 0; }
template<typename X, typename Y>
bool chmin(X& a, Y b) { return (a > b) ? a = b, 1 : 0; }

const int N = 1e5+5;

int n, q, a[N];

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

map<int, ull> H, _H;

ull bit[N], _bit[N];

void init(int x) {
    if (H.find(x) == H.end()) {
        H[x] = rng();
        _H[x] = rng();
    }
}

void add(int p, int v, int sign) {
    for (; p <= n; p += p & -p) {
        bit[p] += H[v] * sign;
        _bit[p] += _H[v] * sign;
    }
}

pii get(int p) {
    ull res = 0, _res = 0;
    for (; p > 0; p -= p & -p) {
        res += bit[p];
        _res += _bit[p];
    }
    return {res, _res};
}

pii query(int l, int r) {
    pii x = get(l - 1), y = get(r);
    return {y.first - x.first, y.second - x.second};
}

void solve() {
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i]; init(a[i]);
        add(i, a[i], 1);
    }
    while (q--) {
        int type; cin >> type;
        if (type == 1) {
            int k, x; cin >> k >> x;
            add(k, a[k], -1);
            a[k] = x; init(x);
            add(k, a[k], 1);
        } else if (type == 2) {
            int l, r, u, v; cin >> l >> r >> u >> v;
            if (r - l != v - u) {
                cout << "NO\n";
                continue;
            }
            pii h1 = query(l, r), h2 = query(u, v);
            if (h1.first == h2.first && h1.second == h2.second) cout << "YES\n";
            else cout << "NO\n";
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    #define TASK "ISOMERS"
    if (fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }

    int tests = 1; // cin >> tests;
    while (tests--) solve();

    return 0;
}
