#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <set>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <memory.h>
#include <string>
#include <sstream>
#include <cstdlib>
#include <ctime>
#include <cassert>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;

#define MP make_pair
#define PB push_back
#define FF first
#define SS second

#define FORN(i, n) for (int i = 0; i <  (int)(n); i++)
#define FOR1(i, n) for (int i = 1; i <= (int)(n); i++)
#define FORD(i, n) for (int i = (int)(n) - 1; i >= 0; i--)

#define MOD 1000000007
#define INF 2000000000

int candF[4], candS[4];

vector<PII> data; vector< vector<int> > common; int csz;

const int MAXN = 200010;
int f[MAXN];

int N, M, Q;

int main() {
    scanf("%d%d", &N, &M);

    for (int i = 1; i <= N; i++) {
        scanf("%d", &f[i]); data.PB(MP(f[i], i));
    }

    data.PB(MP(N+1,N+1));

    sort(data.begin(), data.end());

    int diffidx = -1;

    for (int i = 0; i < data.size(); i++) {
        if (i > 0 && data[i].FF != data[i-1].FF) {
            int cnt = i-1 - diffidx;

            if (cnt >= 500) {
                common.PB(vector<int>());
                for (int j = diffidx + 1; j < i; j++) common[csz].PB(data[j].SS);
                csz++;
            }

            diffidx = i-1;
        }
    }

    scanf("%d", &Q); int l, r;

    for (int i = 0; i < Q; i++) {
        scanf("%d%d", &l, &r); int qlen = r - l + 1;

        if (qlen >= 1500) {
            int good = 0; bool found = false;

            for (int j = 0; j < csz; j++) {
                int cnt = upper_bound(common[j].begin(), common[j].end(), r) - lower_bound(common[j].begin(), common[j].end(), l);

                good += (3 * cnt >= 2 * qlen) + (3 * cnt >= qlen);
                if (good >= 2) { found = true; break; }
            }

            if (found) printf("YES\n");
            else printf("NO\n");
        }
        else {
            int candsz = 0; vector<PII> cand;

            for (int j = l; j <= r; j++) {
                bool inserted = false;

                for (int k = 0; k < cand.size(); k++) {
                    if (cand[k].SS == f[j]) {
                        cand[k].FF += 1;
                        inserted = true;
                    }
                }

                if (!inserted) cand.PB(MP(1, f[j]));

                sort(cand.rbegin(), cand.rend());

                if (cand.size() == 4) {
                    for (int k = 0; k < cand.size(); k++) cand[k].FF -= 1;
                    while (cand[cand.size()-1].FF == 0) cand.pop_back();
                }
            }

            vector<int> candcnt(cand.size());

            for (int j = l; j <= r; j++) {
                for (int k = 0; k < cand.size(); k++) {
                    if (f[j] == cand[k].SS) candcnt[k]++;
                }
            }

            int good = 0;

            for (int k = 0; k < cand.size(); k++) {
                good += (3 * candcnt[k] >= 2 * qlen) + (3 * candcnt[k] >= qlen);
            }

            if (good >= 2) printf("YES\n");
            else printf("NO\n");
        }
    }
    
    return 0;
}
