using
System;
using
System.Collections.Generic;
using
System.Linq;
public
class
GFG
{
const
int
INF = 1000000009;
const
int
N = 100005;
static
List<List<
int
[]>> segtree =
new
List<List<
int
[]>>(
new
int
[4 * N].Select(_ =>
new
List<
int
[]>()));
static
int
[][] occurrences =
new
int
[N][];
static
HashSet<
int
>[] pos = Enumerable.Range(0, N).Select(_ =>
new
HashSet<
int
>()).ToArray();
static
int
val = 4;
static
int
n;
static
void
Build(
int
node,
int
l,
int
r)
{
if
(l == r)
{
segtree[node].Add(
new
int
[] { occurrences[l][0], occurrences[l][1] });
return
;
}
int
mid = (l + r) / 2;
Build(2 * node + 1, l, mid);
Build(2 * node + 2, mid + 1, r);
int
i = 0, j = 0;
while
(i < segtree[2 * node + 1].Count && j < segtree[2 * node + 2].Count)
{
if
(segtree[2 * node + 1][i][0] <= segtree[2 * node + 2][j][0])
{
segtree[node].Add(
new
int
[] { segtree[2 * node + 1][i][0], segtree[2 * node + 1][i][1] });
i++;
}
else
{
segtree[node].Add(
new
int
[] { segtree[2 * node + 2][j][0], segtree[2 * node + 2][j][1] });
j++;
}
}
while
(i < segtree[2 * node + 1].Count)
{
segtree[node].Add(
new
int
[] { segtree[2 * node + 1][i][0], segtree[2 * node + 1][i][1] });
i++;
}
while
(j < segtree[2 * node + 2].Count)
{
segtree[node].Add(
new
int
[] { segtree[2 * node + 2][j][0], segtree[2 * node + 2][j][1] });
j++;
}
int
mx = 0;
for
(
int
k = 0; k < segtree[node].Count; k++)
{
mx = Math.Max(mx, segtree[node][k][1]);
segtree[node][k][1] = mx;
}
}
static
bool
Query(
int
x,
int
y,
int
node,
int
l,
int
r)
{
if
(y - x == val)
return
true
;
if
(l > y || r < x || x > y)
return
false
;
if
(x <= l && r <= y)
{
var
it = segtree[node].FirstOrDefault(a => a[0] >= x);
if
(it ==
null
)
return
false
;
else
{
var
arr = segtree[node];
int
i = arr.Count - 1;
while
(i > 0 && arr[i][0] > x)
{
i--;
}
if
(i > 0 && arr[i][1] > y)
{
return
true
;
}
else
{
return
false
;
}
}
}
int
mid = (l + r) / 2;
bool
leftResult = Query(x, y, 2 * node + 1, l, mid);
bool
rightResult = Query(x, y, 2 * node + 2, mid + 1, r);
return
leftResult || rightResult;
}
static
void
Preprocess(
int
[] arr)
{
for
(
int
i = 0; i < n; i++)
{
if
(pos[arr[i]] ==
null
)
{
pos[arr[i]] =
new
HashSet<
int
>();
}
pos[arr[i]].Add(i);
}
for
(
int
i = 0; i < n; i++)
{
var
it = pos[arr[i]].GetEnumerator();
it.MoveNext();
int
current = it.Current;
while
(current != i)
{
it.MoveNext();
current = it.Current;
}
if
(it.Current == i)
{
occurrences[i] =
new
int
[] { -INF, INF };
}
else
{
occurrences[i] =
new
int
[] { pos[arr[i]].Where(x => x < i).DefaultIfEmpty(-INF).Max(), it.MoveNext() ? it.Current : INF };
}
}
Build(0, 0, n - 1);
}
static
void
AnswerQueries(
int
[] arr, List<
int
[]> queries)
{
Preprocess(arr);
for
(
int
i = 0; i < queries.Count; i++)
{
int
l = queries[i][0] - 1;
int
r = queries[i][1] - 1;
bool
there = Query(l, r, 0, 0, n - 1);
if
(there)
{
Console.WriteLine(
"Yes"
);
}
else
{
Console.WriteLine(
"No"
);
}
}
}
static
void
Main()
{
int
[] arr = { 1, 2, 1, 2, 3, 4 };
n = arr.Length;
List<
int
[]> queries =
new
List<
int
[]> {
new
int
[] { 1, 4 },
new
int
[] { 1, 5 } };
AnswerQueries(arr, queries);
}
}