You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.3 KiB
C++

#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
const int LogN = 18;
int minT[LogN][N], maxT[LogN][N], Log[N];
int a[N], b[N], cnt[N], ans[200005];
struct query
{
int id, l, r, b;
} Q[200005];
inline bool operator<(const query &x, const query &y) { return x.b < y.b || (x.b == y.b && x.r < y.r); }
int qmax(int l, int r)
{
int z = Log[r - l + 1];
return max(maxT[z][l], maxT[z][r - (1 << z) + 1]);
}
int qmin(int l, int r)
{
int z = Log[r - l + 1];
return min(minT[z][l], minT[z][r - (1 << z) + 1]);
}
int main()
{
Log[0] = -1;
for (int i = 1; i < N; i++) Log[i] = Log[i >> 1] + 1;
int T, m, n;
scanf("%d", &T);
while (T--)
{
memset(cnt, 0, sizeof(cnt));
scanf("%d%d", &n, &m);
int S = int(sqrt(n));
for (int i = 1; i <= n; i++)
{
scanf("%d", a + i);
minT[0][i] = maxT[0][i] = b[i] = a[i];
}
for (int j = 1; j < LogN; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
minT[j][i] = min(minT[j - 1][i], minT[j - 1][i + (1 << (j - 1))]),
maxT[j][i] = max(maxT[j - 1][i], maxT[j - 1][i + (1 << (j - 1))]);
for (int i = 0; i < m; i++)
{
query &q = Q[i];
scanf("%d%d", &q.l, &q.r);
q.id = i, q.b = Q[i].l / S;
}
sort(b + 1, b + n + 1);
auto ed = unique(b + 1, b + n + 1);
for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, ed, a[i]) - b;
std::sort(Q, Q + m);
for (int i = 0, L = 0, R = 0, tot = 0; i < m; i++)
{
int l = Q[i].l, r = Q[i].r;
while (L < l)
if (!--cnt[a[L++]]) --tot;
while (L > l)
if (!cnt[a[--L]]++) ++tot;
while (R < r)
if (!cnt[a[++R]]++) ++tot;
while (R > r)
if (!--cnt[a[R--]]) --tot;
//printf("**** %d %d %d %d %d\n", l, r, qmin(l, r), qmax(l, r), tot);
ans[Q[i].id] = (qmax(l, r) - qmin(l, r) + 1) == tot;
}
for (int i = 0; i < m; i++)
puts(ans[i] ? "YES" : "NO");
}
return 0;
}